return-type 相关问题

用于处理函数返回的变量或值的类型的问题。

返回类型为 void

我正在使用 PHP 7 测试返回类型。 我创建了一个简单的脚本来测试 PHP 7 的返回类型: 我正在使用 PHP 7 测试返回类型。 我创建了一个简单的脚本来测试 PHP 7 的返回类型: <?php Class Obj { public function __construct(){ } public function test(): string { //a string needs to be returned return "ok"; } } function foo(): Obj { //instance of Obj needs to be returned return new Obj(); } $o = foo(); echo $o->test(); // output: ok 现在在其他编程语言中,当您指定返回类型时void,这意味着您无法返回任何内容,否则会收到错误。所以我写了这个脚本: <?php function foo(): void { } foo(); 现在在上面的脚本中,预期的输出什么也没有。 相反,它给了我一个致命错误: 致命错误:foo()的返回值必须是void的实例,第2行没有返回 我的问题是(我找不到),在 PHP 7 中会有类似的 void 类型吗? 编辑: 针对 void 返回类型的新单独 RFC 已发布,已通过投票,并在 PHP 7.1 中实现。 PHP 中现在有一个 void 返回类型。 :) 原帖: 取自wiki.php.net: 未来的工作 超出本 RFC 范围的未来工作想法包括: 允许函数声明它们根本不返回任何内容(Java 和 C 中为 void) 所以目前没有办法声明您不退回任何东西。 我不知道在你的情况下什么是最好的,但我可能会暂时不声明返回类型。 回答你的问题 PHP 7 中是否会有 void 返回类型: 目前还没有 保证,但我认为 void 或同义词很可能会以某种方式实现。 php 7.1 接受 void返回类型。所以它会在未来出现。 有关其工作原理的一些示例: function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value } function returns_null(): void { return null; // Fatal error: A void function must not return a value } function lacks_return(): void { // valid } function returns_nothing(): void { return; // valid } 请参阅 Andrea Faulds 的 RFC 了解更多信息! 编辑:在 PHP 7.1 中,有一个 void 伪类型。它在Void Return Type RFC中定义。以下是 7.1 之前的答案。 返回类型 RFC 的作者在这里。在 PHP 7.0 中,不会有 void 返回类型,因为 RFC 没有添加它,任何其他针对 PHP 7.0 的 RFC 也没有添加它。 如果我们决定为次要版本添加新的关键字/保留字是可以的,即使它们会破坏代码,则类型 void 可以存在于 PHP 7 系列中。这有点不确定,但它是在 PHP 5.4 中使用 callable 关键字完成的。 就个人而言,我认为我们不需要void;我们已经有了 null。 来自手册: 特殊的NULL值表示没有值的变量。 NULL 是 null 类型唯一可能的值。 在 PHP 中,不返回任何内容的函数将隐式返回 null。这意味着您永远无法“实际上”返回任何内容*。走 null 路线意味着不会出现向后兼容性中断,因为 null 不会是从 PHP 7.0 开始的有效类/接口/特征名称,并且不会添加任何新键或保留字。 *熟悉 Zend 引擎的人会意识到你可以不返回任何内容,但如果你不返回任何内容,你正在分配的变量将被分配为 null,这使得它们在逻辑上是等效的。 php 中没有 void 的等效类型, 返回空值;可能符合您的要求,因为它没有任何类型,如 0 或任何其他值。注意:实际无效意味着没有返回。 @BeNice 我理解你的观点,无论如何我总结了以下考虑 Levi Morrison 作为可持续发展的一个实际问题:引入 void 作为可能的回报类型事实上,我们打破了 null 唯一可能类型是 null 的假设。 这样,应该返回void来进行null的类型检查,通过设计改变架构约束并导致向后兼容性混乱。 // your choice implies this comparison should be true: gettype(null) === void; 我认为在代码中不经常使用 null 的人将承担 void 类型实现。 虽然当你设置返回类型为void时你不能返回任何东西,但是你可以在函数中打印一些东西。 类似这样的事情。 <?php function foo(): void { print "OK"; return; } foo(); ?> 这将打印“OK”,但它不返回任何内容。 另外,需要注意的是,我们只能使用 void 作为返回类型。我们不能将它用作函数参数类型。 示例: function myfunction(void $param) { } 它将产生这个致命错误 // Fatal error: void cannot be used as a parameter type 此外,如果您使用OOP,则无法在继承期间更改void返回类型。 示例: class MyClass { public function myMethod(): void { } } class MyNewClass extends MyClass { public function myMethod(): array { } } 这将产生这个致命错误 Fatal error: Declaration of MyNewClass::myMethod(): array must be compatible with MyClass::myMethod()

回答 6 投票 0

为什么我返回函数时得到“1”?

我对编程和 C++ 非常陌生,所以我确信对于比我更有经验的人来说,这是一个超级简单的问题。但是,唉,我是新手,所以这是我的问题: 我正在努力...

回答 1 投票 0

Symfony:在 Doctrine 实体方法中使用返回类型提示的表单问题

我今天异常勤奋,决定返回类型提示我所有的 symfony 实体方法。所以: 我今天异常勤奋,决定返回类型提示我所有的 symfony 实体方法。所以: <?php Class User { private string $username; public method getUsername(): string {} } 一切都很好,直到我制作了一个表单来创建新用户: $user = new User(); $this->createForm(SignupType::class, $user); 当显示表单时,Symfony 会自动获取 User $user 这个新实例的属性。但由于它是一个新的实例化,它的 username 属性当然仍然是 null,这是一个不正确的返回类型,因为它需要是 string。 我应该: Symfony 实体中没有返回类型提示(meh); set $username = ''(但这有点违背了不允许空白的目的,我可以看到各种错误的演变);或 取消映射 symfony 表单上的字段 其他可能的解决方案... 如果实体属性不能是 null(并且您使用 PHP 7.1+),那么应用 可空返回类型声明听起来更像是一种肮脏而快速的解决方法,以维护实体和表单之间的直接数据绑定(使用 Symfony 表单组件)。 更好的全局方法(在我看来)是使用 DTO(数据传输对象)将表单数据绑定与 Doctrine 实体解耦,这是一个简单的 POPO(普通旧 PHP 对象)来包含您的形成数据。 使用 DTO 将允许您在 Doctrine 实体中维护严格的类型提示(不会丢失数据一致性),并将表单数据绑定(还有数据验证)与实体解耦。 DTO 允许重复使用并具有许多其他优点。 有关将 DTO 与 Symfony Forms 一起使用的一些有用参考: DEAD LINK 避免表单中的实体(作者:Iltar van der Berg) DEAD LINK 重新思考表单开发(作者 Iltar van der Berg) Symfony Forms 101(由 Form 组件的创建者 Bernhard Schussek) 不要在 Symfony 表单中使用实体。请改用自定义数据对象 实体应始终有效 如果您使用的是 PHP 7.0,它不支持可为 null 的返回类型声明,则第一个选项将是正确的(非 hacky)选择。如果您使用 PHP 7.1+,您可以定义一个 可空返回类型声明。 <?php class User { public function getUsername(): ?string {} }

回答 2 投票 0

在 C 中返回 const 有什么作用?

关于 C++ 有一个类似的问题,但它似乎不太适用于 C。我正在制作一个函数来计算八进制树交集,并且我将参数设置为 const。然而,有时...

回答 1 投票 0

如何在 Prisma 中返回正确的嵌套包含类型?

使用带有嵌套包含的查询时,我无法从函数返回正确的类型。嵌套字段丢失。我使用与此类似的模型: 模型 Foo { id 字符串 @id @default...

回答 1 投票 0

构造函数返回什么?

我的问题是构造函数返回什么?这个问题与“构造函数的返回类型是什么?”没有太大不同。 我在某处读到构造函数返回一个完整的对象

回答 7 投票 0

c++11 是否可以创建一个带有允许各种返回类型 T 或 const T& 的函数的接口?

我想为返回消息的类创建一个接口。 我的问题是,有时返回一个字符串会更好,有时返回一个 const string& 会更好。 最好的方法是什么...

回答 1 投票 0

前向声明函数允许不正确的返回类型:为什么这里没有链接器错误?

$ g++ --版本 配置为: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本...

回答 1 投票 0

为什么在这种特定情况下不会抛出链接器错误?

$ g++ --版本 配置为: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本...

回答 1 投票 0

为什么前向声明允许使用不正确的返回类型

$ g++ --版本 配置为: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本...

回答 1 投票 0

如何在 Razor 中返回与模型相同页面的重定向?

在 OnPost 方法中我有两个选择 成功:我需要重定向到查看页面。 失败:我需要返回包含填充模型的同一页面以向用户显示错误。 处理程序应该返回什么?

回答 1 投票 0

phpstan - 返回通用的

我觉得问这么简单的问题很愚蠢,但我显然错过了一些基本的东西。 下面的 CollectionOrdered 类旨在“携带有效负载”,而 HasPayloadInterface 的要点...

回答 1 投票 0

用户定义的函数仅返回列中的第一个值

我正在为一个类编写一个函数,该函数应该转换我表中的列之一。我正在使用他们给我的数据库(DVD 租赁)。我认为最终目标是将这个函数添加为

回答 1 投票 0

在 C++ 中使用 auto 处理类型更改

返回类型从 const Bar& getBar() 更改为 const Bar getBar()。 如果我使用: const auto& bar = getBar(); 并且返回类型发生变化。我有一个临时对象的引用。 如果我使用: ...

回答 1 投票 0

通过引用返回的函数和返回 const 值的 const 函数之间的区别[重复]

我正在为数组创建一个类以用作堆栈,并遇到两种类型的函数来返回顶部元素。我无法理解两者之间的区别以及编译器如何决定...

回答 3 投票 0

断言在c++中返回一个值

在 C++ 中让断言返回一个值非常有用,如下所示: SomeType someValue = 断言(getSomeValue()); 代替 SomeType someValue = getSomeValue(); 断言(一些值); 有吗

回答 1 投票 0

返回带有泛型的对象子类

对于抽象类,我想定义一个为子类返回“this”的方法: 公共抽象类 Foo { ... 公共 T eat(String eatCake) { ...

回答 4 投票 0

返回时设置特定类型而不传递初始值

我有一个函数可以推断文本文件的某些参数的类型。其中一些确实已经有了初始值,因为有些值是不可能从...

回答 1 投票 0

如何将多个值发送到方法并在 Java 中的不同变量中接收多个值

你好,我是 Java 新手,我正在锁定一种向方法发送多个参数的方法,但该方法也需要返回一些值,例如: var1,var2,var3 = 转换为负值(varx,vary,...

回答 1 投票 0

为什么 MATLAB 中的 find 返回索引为双精度值?

MATLAB 中的 find 函数返回给定逻辑参数计算为 true 的索引。 因此我想知道,为什么返回的索引类型是 double 而不是 uint32 或 uint64 像最大的

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.