我正在制作一个插件系统。我有一个类extensionmanager
,它将插件的名称作为构造函数参数。长话短说,这是我试图运行的代码:
$this->parsedata = function($data) {
$this->extension::parsedata($data);
};
$this-extension
是一个包含插件名称的字符串。我之前以这个例子中显示的确切方式运行静态函数。现在我在第二行收到错误unexpected T_PAAMAYIM_NEKUDOTAYIM
(我听说它大致翻译为“意外的双冒号”)
有人能帮助我理解为什么吗?
在上面的例子之前,我尝试运行类似这样的东西
$this->parsedata = &$this->extension::parsedata;
因此问题标题。我认为最好的例子更接近于工作,所以我改变了它。
答案 0 :(得分: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);
答案 1 :(得分:3)
那样做:
$self = $this;
$this->parsedata = function($data) use ($self) {
{$self->extension}::parsedata($data);
};
然而,我建议避免使用静态函数。毕竟,谁将要使用您的扩展管理器将需要符合某些界面。为什么不利用抽象方法或接口来使用户符合您的界面呢?