【问题标题】:How to specify the void return type for a constructor如何为构造函数指定 void 返回类型
【发布时间】:2020-09-10 04:08:03
【问题描述】:

为了保持一致性,我从 PHP 7.1 开始为所有方法指定 return types,包括像 __toString 这样的魔术方法,即使隐式返回类型是 void,就像 __unserialize() 一样:

class a {
  function __toString() : string {}
  function __unserialize ( array $data ) : void {}
  function __wakeup() : void {}
}

当我对constructors and destructors 尝试相同的操作时,如下所示:

class a {
  function __construct() : void {}
  function __destruct() : void {}
  function __clone() : void {}
}

PHP 产生Fatal errors:

Constructor a::__construct() cannot declare a return type
Destructor a::__destruct() cannot declare a return type
Clone method a::__clone() cannot declare a return type

我现在唯一能做的就是在这样的文档块中指定隐式返回类型:

/**
 * @return void (implicit)
 */

我很困惑为什么,因为其他预定义的方法确实支持显式返回类型。我在the docsthe RFC 中找不到有关此偏差的任何信息。

如何为构造函数和析构函数指定返回类型void?如果在 PHP 7 中无法实现,那么在 PHP 8 中是否可以实现?

【问题讨论】:

  • 构造函数和析构函数不(也不能)返回任何东西,那么他们为什么要支持它呢?这将毫无意义。
  • 构造函数不会显式返回任何内容。它们没有返回类型。
  • 构造函数返回其类的类型。这从 PHP 7.4(或者可能是 7.3)开始有效。
  • 构造函数返回voidper documentation。创建对象后,调用构造函数来初始化对象。我的观点是你不能自己指定返回类型void,这与泛型方法声明不一致。就像无法在公共方法上指定 public 关键字一样,因为它们默认是公共的,您唯一的选择是 protectedprivate
  • @MagnusEriksson 为了语法简洁起见,应该支持它,正如 Swatantra Kumar 发现的此错误报告 bugs.php.net/bug.php?id=75263 中所述。可以这样想:为什么__construct() 的魔术函数与__unserialize() 有什么不同?

标签: php oop php-7 php-7.1 php-8


【解决方案1】:

ConstructorsDestructors 的概念在 PHP5 中是 introduced。他们不明确返回任何东西。它们没有任何返回类型。

正如构造函数的定义所言,它用于创建作为类实例的对象。它用于初始化类的对象,因为构造函数声明看起来就像没有返回类型的方法声明。

【讨论】:

  • 这是我为什么要指定构造函数和析构函数的返回类型的另一个例子,即void。您可以在您提供的文档链接中查找它。人们倾向于认为构造函数返回一个指向实例的指针,这是不正确的。
  • @Code4R7 签名为void,但不能显式声明。 3 年前有一个错误报告为 bugs.php.net/bug.php?id=75263,php 团队将其标记为“不是错误”,提到“面向对象语言中的构造函数没有返回类型”。
  • 感谢您找到该错误报告。这是PHP语法的不一致,应该修复。该报告将设计决策标记为“不是错误”,这意味着创建 PHP 的人在可预见的未来不会解决它,这是我们必须忍受的。
  • 构造函数没有“返回类的当前实例”。构造函数不返回 anything。这是demo。这是创建实例的关键字new
  • 确实,如果可以像文档一样使用有效的 PHP 语法来表达,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 2018-04-06
  • 2013-11-29
  • 2021-12-19
  • 1970-01-01
  • 2012-12-28
  • 2020-01-25
相关资源
最近更新 更多