在_callstatic中调用静态类不起作用

时间:2013-07-06 04:39:34

标签: php

我正在开发一个插件系统,目前我被迫使用call_user_func_array。这很慢并且使用记忆。

我的功能正常,看起来像这样:

public static function __callStatic($method, $args)
{
    $plugins = self::_checkEventCache($method);

    if( count($plugins) ) :
    foreach( $plugins as $p ):
        $tmp =  call_user_func_array(array(self::$_installedPlugins[$p], $method), array(&$args));
        endforeach;
    endif;

self::$_current_event = $method;
}

我的问题是如何直接调用它或加快速度?我永远不会知道将来会附加多少论点。

摆脱call_user_func_array的任何解决方案?

$tmp =也没有解决这个问题。早些时候 - 当我没有使用静态时,它返回了一个值。我使用的旧代码是这样的:

$tmp = $this->_installedPlugins[$p]->{$method}($args);

if( $tmp !== NULL ){
    $this->_event_result[$method] = $tmp;
}

当我使用静态类时,我需要获得相同的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在我看来,你没有用$ tmp变量做任何事情。但它应该被分配一些价值。

无论如何我不确定你的插件方法调用是否也是静态的,所以我要描述两种情况。 第一个非静态插件方法调用:

在这种情况下,您可以像使用旧代码一样使用类似的方法调用

$tmp = self::$_installedPlugins[$p]->{$method}($args);

现在使用statuc插件调用的情况:

现在它有点棘手了,PHP显然不会让你在一个表达式中有两组::所以你必须绕过它:

$plug= self::$_installedPlugins[$p];
$tmp = $plug::{$method}($args);

我已经在PHP 5.4上测试了它,它似乎有效。