0

我正在开发一个插件系统,目前我被迫使用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;
}

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

有任何想法吗?

4

1 回答 1

0

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

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

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

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

现在 statuc 插件调用的情况:

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

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

我已经在 PHP 5.4 上对其进行了测试,它似乎可以工作。

于 2013-07-06T08:14:19.937 回答