2011-02-28 70 views
0

我在做一個插件系統。我有一個類extensionmanager,它將插件的名稱作爲構造函數參數。長話短說,這是我試圖運行代碼:我如何參考PHP函數?

$this->parsedata = function($data) { 
    $this->extension::parsedata($data); 
}; 

$this-extension是插件的名稱的字符串。我以前的示例中顯示的確切方式運行靜態函數。現在我得到第二行的錯誤unexpected T_PAAMAYIM_NEKUDOTAYIM(我聽說它大致轉化爲「意想不到的雙冒號」)

誰能幫我理解爲什麼?


上面的例子之前,我試圖運行這樣的事情

$this->parsedata = &$this->extension::parsedata; 

因此,問題的標題。我認爲最好的例子更接近工作,所以我改變了它。

回答

3

call_user_func可能會給你一個解決方案。在某處的例子,你有這樣的代碼:

<?php 

namespace Foobar; 

class Foo { 
    static public function test() { 
     print "Hello world!\n"; 
    } 
} 

call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0 
call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0 

?> 

我認爲你可以很容易地適應這個打電話給你的靜態函數。例如像:

call_user_func(array($this->extension, 'parseData'), $data); 
3

這樣做:

$self = $this; 
$this->parsedata = function($data) use ($self) { 
    {$self->extension}::parsedata($data); 
}; 

不過,我會建議,以避免靜電的功能。畢竟,誰將使用你的擴展管理器將需要符合一些接口。爲什麼不利用抽象方法或接口來使用戶符合你的界面?