我搜索了这个原因,但找不到任何原因。
我试图创建一个类型为“可调用”的类型化属性。但是 PHP 给了我一个致命错误“不能有可调用的类型”。在 RFC 中,没有提到 callable 不是属性类型提示的允许类型。相反,有一些示例,其中使用了类型属性的“可调用”。
见:https ://wiki.php.net/rfc/typed-properties
这是什么原因?网上有没有关于这个话题的讨论?
我搜索了这个原因,但找不到任何原因。
我试图创建一个类型为“可调用”的类型化属性。但是 PHP 给了我一个致命错误“不能有可调用的类型”。在 RFC 中,没有提到 callable 不是属性类型提示的允许类型。相反,有一些示例,其中使用了类型属性的“可调用”。
见:https ://wiki.php.net/rfc/typed-properties
这是什么原因?网上有没有关于这个话题的讨论?
提供的链接https://wiki.php.net/rfc/typed-properties中的提案状态为denied。
在 php7.4 中实现的提案在这里https://wiki.php.net/rfc/typed_properties_v2并且有一个关于callable
:
不支持可调用类型,因为它的行为取决于上下文以下示例说明了该问题:
class Test { public callable $cb; public function __construct() { // $this->cb is callable here $this->cb = [$this, 'method']; } private function method() {} } $obj = new Test; // $obj->cb is NOT callable here ($obj->cb)();
这意味着可以将合法值写入属性,然后继续从同一属性中读取非法值。伪类型的这个基本问题在一致的 callables RFC
callable
中有更详细的阐述。推荐的解决方法是使用
Closure
类型,与Closure::fromCallable()
. 这确保了可调用对象将保持可调用独立于范围。有关处理可调用问题的替代方法的讨论,请参阅替代部分。
php7.4 的所有已实施提案的列表在这里https://wiki.php.net/rfc#php_74。