2013-04-10 101 views
1

關閉似乎沒有完全暴露於反思。在檢查作爲一個對象,它似乎並不具有任何有用的東西:我可以找到PHP匿名函數的定義位置嗎?

$foo = function ($a, $b) {}; 
$ref = new ReflectionObject($foo); 
var_dump($ref->getFileName()); // false 

你可以匿名函數的參數:

$invoker = $ref->getMethod('__invoke'); 
var_dump($invoker->getParameters()); // "a" and "b"! 

但不是它被定義爲:

var_dump($invoker->getFileName()); // false 

有沒有想法?

回答

3

我認爲你要找的是ReflectionFunction而不是ReflectionObject

Here是參考。它甚至包含一個isClosure方法,並接受一個閉包作爲構造函數參數。 :-)

實施例:

$callback = function(){ echo 'hello'; }; 
$r = new ReflectionFunction($callback); 
$startLine = $r->getStartLine(); 
$file = $r->getFileName(); 
$is_closure = $r->isClosure(); 
+0

感謝。我只部分閱讀了文檔,並假定「name」參數需要一個字符串。 – 2013-04-10 16:44:14

+0

(針對未來的訪問者)我更新了我的回答,以表明它可以對'__construct()'參數進行閉包。 – 2013-04-10 16:50:23

相關問題