我正在尝试反思并尝试理解闭包。 这是我的代码(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
。
这里发生了什么?
答案 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);
供参考,见:
有关示例,请参阅: