如何测试 Callable 参数是否 return 带有反射的字符串?

How to test if Callable parameter will return a string with Reflection?

我有一个需要 Callable 参数的函数。我想确定这个可调用 returns 是一个字符串,如果不是,则应抛出异常。

我试着搜索这个,但没有成功。 PHP 反射 API 是否提供这样的功能?我不想 运行 这个方法,看看它是否真的 returns 一个字符串。

我需要的示例:

class MyClass
{
    protected static $overrider = null;

    public static function setOverrider(Callable $callback)
    {
        // Pseudo code start
        if (!$callback returns string) {
            throw new \Exception('Wasnt a string!');
        }
        // Pseudo code end     

        self::$overrider = $callback;
    }
}

也许你需要这样的东西:

class MyClass
{
    protected static $overrider = null;

    public static function setOverrider(Callable $callback)
    {
        $reflection = new ReflectionFunction($callback);
        if ('string' != $reflection->getReturnType()) {
            throw new \Exception('Wasnt a string!');
        }  

        self::$overrider = $callback;
    }
}

因此,正如我之前在评论中提到的:您需要声明 returning 类型的可调用对象(即 PHP7+ feature)。必须的,不然不行

像这样:

function my_function(): string
{
    return 'hello';
}

或者如果你更喜欢匿名函数,可以像这样 (Closure):

$my_callable = function(): string {
    return 'hello';
}

就这么简单: 如果您不首先告诉解释器 return 所讨论的函数应该 return 什么,解释器就无法在不调用它的情况下知道函数的数据类型。