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

msc*_*cho 10 php properties php-7.4

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

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

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

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

u_m*_*der 10

提供的链接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)();
Run Code Online (Sandbox Code Playgroud)

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

推荐的解决方法是改用Closure类型,与Closure::fromCallable(). 这确保了可调用对象将保持可调用独立于作用域。有关处理可调用问题的替代方法的讨论,请参阅替代部分

php7.4 的所有已实施提案列表在这里https://wiki.php.net/rfc#php_74