【问题标题】:Type-hint closure parameters类型提示闭包参数
【发布时间】:2019-11-10 13:11:57
【问题描述】:

使用 PHP 中的类型提示是否可以对闭包的参数进行类型提示?

例如

function some_function(\Closure<int> $closure) {
    $closure(3);
}

// This would throw an exception
some_function(function(string $value) {
    echo $value;
});

// This would work.
some_function(function(int $value) {
    echo $value;
});

【问题讨论】:

  • 不,这不可能。
  • 我们希望 :) 脚本语言不支持它。
  • “脚本语言不支持” - 你检查过所有脚本语言了吗?
  • :'( 猜猜我在用 JAVA 写这个。
  • 如果严格键入对您来说非常重要,那么 PHP 将不适合。是的,自 PHP 5 以来它已经走了很长一段路,但它仍然没有像许多其他类型语言那样严格(而且可能永远不会那样,至少不像 Java 那样严格)。

标签: php closures type-hinting


【解决方案1】:

不是本地的。您需要手动使用reflection

<?php
function some_function(\Closure $closure) {

    $reflection = new ReflectionFunction($closure);
    $parameters = $reflection->getParameters();
    if(!isset($parameters[0]))
    {
        // I'm lazy but you should program this to throw a fatal exception
        echo 'some_function() expects parameter one\'s closure to expect at least one parameter'.PHP_EOL;
    }
    elseif($parameters[0]->getType().'' !== 'int') // I'm sure there is a more elegant way to achieve this...
    {
        // I'm lazy but you should program this to throw a fatal exception
        echo 'closure\'s first param should be an int'.PHP_EOL;
    }
    else
    {
        $closure(3);
    }
}

// Does not throw an exception
some_function(function(int $value) {
    var_dump($value);
});

// This throws an exception
some_function(function() {
    var_dump($value);
});

// This throws an exception
some_function(function(string $value) {
    var_dump($value);
});

生产:

int(3)
some_function() expects parameter one's closure to expect at least one parameter
closure's first param should be an int

另见Deducing PHP Closure parameters

【讨论】:

  • 这不是我想要的。这将要求传递给闭包的参数与给定的闭包匹配,而不要求提供给some_function 的闭包具有 X 类型的参数。与我希望实现此代码的人实际执行的操作相比,这导致错误消息不是很清楚。
  • @NathanF。哦,我明白了。我不认为 PHP 支持这一点。很抱歉造成误解。
  • 是的,不幸的是,我认为反射是实现这一目标的唯一真正方法。
  • @NathanF。目前,是的。鉴于这是如何在“用户代码”中实现的,我想 PHP 可以在以后将其构建到核心中。我想你可以编写一个通用函数来自动执行这些类型提示。你也可以提出一个RFC 并让 PHP 成为一个更好的地方:)
  • @NathanF.我很想知道您是选择继续使用 PHP 还是根据comment 最终使用 Java
猜你喜欢
  • 2021-06-21
  • 2016-01-27
  • 2023-04-06
  • 1970-01-01
  • 2021-01-25
  • 2012-01-21
  • 2015-08-21
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多