为什么__invoke不会在ReflectionClass :: getMethods结果中显示闭包,但ReflectionClass :: hasMethod(“__ invoke”)返回true?

时间:2017-04-10 14:47:54

标签: php reflection closures

我正在尝试反思并尝试理解闭包。 这是我的代码(PHP版本是5.6):

function closureWithState ($name) {
    return function () use ($name) { // 'use' keyword attaches the closure state
        return strToUpper($name);
    };
}

$closure = closureWithState('Foo');

$reflector = new ReflectionClass($closure);
$methods = $reflector->getMethods();
foreach ($methods as $method) {
    echo $method->getName() . PHP_EOL;
}

echo "Result of hasMethod for __invoke: " .$reflector->hasMethod("__invoke") . PHP_EOL;

我的输出是

__construct
bind
bindTo
Result of hasMethod for __invoke: 1

所以似乎getMethods返回方法 __ construct bind bindTo 但不是 __ invoke 。但是当我测试hasMethod("__invoke")时,它会返回true

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

您应该在此使用ReflectionObject而不是ReflectionClass

<?php

$closure = function () {};

$reflection = new \ReflectionObject($closure);

$methodNames = array_map(function (\ReflectionMethod $method) {
    return $method->getName();
},  $reflection->getMethods());

var_dump($methodNames);

供参考,见:

有关示例,请参阅: