2013-07-06 3 views
0

Я работаю над плагиновой системой, и на данный момент я вынужден использовать call_user_func_array. И это медленно и использует память.вызов статического класса внутри _callstatic не работает

Моя функция работает, и выглядит следующим образом:

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 = также не работает над этим. Раньше - когда я не использовал static, он возвращал значение. Старый код, который я использовал, был так:

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

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

Мне нужно, чтобы получить те же результаты, теперь, когда я использую статический класс.

Любые идеи?

ответ

0

Мне кажется, что вы ничего не делаете с переменной $ tmp. Но ему нужно присвоить некоторую ценность.

В любом случае, я не уверен, что вызовы метода плагинов также статичны или нет, поэтому я расскажу обо всех случаях. Первый нестатическая метод плагин вызывает:

В этом случае вы можете использовать подобный метод вызова, как в старом коде

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

И теперь случай с statuc плагин вызывает:

Теперь it' са немного сложнее, PHP, очевидно won't пусть у вас есть два комплекта :: в одном выражении, так что вы должны обойти это следующим образом:

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

I ве тестировал на PHP 5.4, и это, кажется, работает.

+0

Спасибо. Только то, что я искал. У меня также были проблемы с выражением. Итак, проблема решена. –