2011-06-26 55 views
3

Possible Duplicate:
Initialize class property with an anonymous functionPHP匿名函數聲明在現有的類對象

我已經PHP編程相當長一段時間,和PHP 5.3匿名函數是其中之一認爲,幫你出了很多,同時建立一些簡單的腳本。但是,我不明白爲什麼下面的例子不起作用?

$db   = new PDO([..]); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
$db->die = function($str){ die(var_dump($str)); }; 

$db->die('[..]'); 

畢竟,我所做的就是聲明匿名函數 - > PDO實例的die屬性。這有點讓我覺得這是一個PHP的錯誤。

+0

會發生什麼情況? 「新PDO([..])」代表什麼? –

+0

它只會產生'致命錯誤:調用未定義的方法PDO :: die()in [..] on [..]' – Gajus

回答

0

按照這一問題的答案:php Set a anonymous function in an instance

它是由設計(或設計錯誤)。這裏提供了一些解決方法建議。

+0

這是一個不同的情況。我在實例啓動後聲明匿名函數。沒有明顯的原因會導致失敗。 – Gajus

+0

@Guy啊,真的。第二個環節的答案應該適用於任何情況? –

+0

您是否指'__call()'「解決方法」?這就要求擴展原來的類,並且通常會制止匿名函數的概念。 – Gajus

0

這工作:

class Foo{ 
    public $bar; 
} 
$foo = new Foo; 
$foo->bar = function(){ 
    echo "Hello, world\n"; 
}; 
call_user_func($foo->bar); 
+0

你可以用''func = $ foo-> bar改變''call_user_func''; $ FUNC();'' – petraszd

1

分配到屬性的功能屬性不會改變成一個函數。要執行存儲在屬性中的函數,您必須使用__call魔方:

class Foo extends PDO { 
    function __call($function, $args) { 
     return call_user_func_array($this->{$function}, $args); 
    } 
} 

$db   = new Foo([..]); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
$db->die = function($str){ die(var_dump($str)); }; 

$db->die('[..]');