类型化属性是否支持类型可调用?

2022-08-30 23:33:32

我搜索了原因,但找不到任何原因。

我试图创建一个类型化的属性,类型为“callable”。但是PHP给了我一个致命的错误“不能有类型可调用”。在 RFC 中,没有提到可调用不是属性类型提示的允许类型。相反,有一些示例,其中使用“callable”作为类型化属性。

请参见: https://wiki.php.net/rfc/typed-properties

这是什么原因?网上有关于这个话题的讨论吗?


答案 1

提供的链接 https://wiki.php.net/rfc/typed-properties 中的提案状态已被拒绝

在 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)();

这意味着可以将合法值写入属性,然后继续从同一属性中读取非法值。伪类型的这个基本问题在一致的可调用RFC中更详细地阐述了。callable

建议的解决方法是将类型与 结合使用。这可确保可调用的可调用性与作用域无关。有关处理可调用问题的替代方法的讨论,请参阅替代方法部分ClosureClosure::fromCallable()

php7.4 的所有已实现提案的列表 https://wiki.php.net/rfc#php_74。


答案 2

推荐