2011-02-28 50 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); 
}; 

不过,我会建议,以避免静电的功能。毕竟,谁将使用你的扩展管理器将需要符合一些接口。为什么不利用抽象方法或接口来使用户符合你的界面?