Есть ли в PHP какие-либо преимущества использования forward_static_call_array () вместо call_user_func_array () при динамическом вызове статического метода? - PullRequest
12 голосов
/ 26 февраля 2010

В частности, один эффективнее другого?

1 Ответ

11 голосов
/ 26 февраля 2010

Существует как минимум две разницы между forward_static_call_array и call_user_func_array:

  • Первый существует только с PHP 5.3
  • Первый должен вызываться из класса

После этого, я полагаю, есть некоторая разница, связанная с поздним статическим связыванием, которое было введено в PHP 5.3.


На самом деле, если вы внимательнее посмотрите на данный пример, кажется, что это именно то: «контекст» класса, внутри которого вы используете forward_static_call_array, «сохраняется» в вызываемом методе.

Учитывая эту часть кода, полученную из данного примера:

class A {
    const NAME = 'A';
    public static function test() {
        $args = func_get_args();
        echo static::NAME, " ".join(',', $args)." \n";      // Will echo B
    }
}

class B extends A {
    const NAME = 'B';
    public static function test() {
        echo self::NAME, "\n";          // B
        forward_static_call_array(array('A', 'test'), array('more', 'args'));
    }
}

B::test('foo');

Вы получите этот вывод:

B
B more,args

т.е. из метода в классе A через ключевое слово static:: вы «знаете», что «исходите из B».


Теперь, если вы попытаетесь сделать то же самое с call_user_func:

class B extends A {
    const NAME = 'B';
    public static function test() {
        echo self::NAME, "\n";          // B
        call_user_func_array(array('A', 'test'), array('more', 'args'));
    }
}

(остальная часть кода не изменяется)

Вы получите этот вывод:

B
A more,args

Обратите внимание на A во второй строке! С forward_static_call_array вы получаете не A , а B .

В этом разница: forward_static_call_array перенаправляет статический контекст вызываемому методу, а call_user_func_array - нет.


По поводу вашего вопроса эффективности: я понятия не имею - вам нужно будет сравнить результаты; но дело не в этом: дело в том, что эти две функции не делают одно и то же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...