【问题标题】:Is type callable supported with typed properties?类型化属性是否支持类型可调用?
【发布时间】:2020-01-16 01:04:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你看看proposables。我认为它还没有实现。
  • 在php7.4中应该实现这个提议。

标签: php properties php-7.4


【解决方案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)();

这意味着可以将合法值写入属性 然后继续从同一属性中读取非法值。这 callable 伪类型的基本问题在很多方面都有阐述 更多细节在consistent callables RFC

建议的解决方法是改用 Closure 类型,在 结合Closure::fromCallable()。这确保了 callable 将保持可调用独立于范围。进行讨论 有关处理可调用问题的替代方法,请参阅Alternatives section

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

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多