Подтвердить что ты не робот

В PHP существуют ли какие-либо преимущества при использовании forward_static_call_array() вместо call_user_func_array() при динамическом вызове статического метода?

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

4b9b3361

Ответ 1

Существует два различия между forward_static_call_array и call_user_func_array:

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

После этого, я полагаю, есть некоторая разница, связанная с Late Static Binding, которая была введена с 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 - нет.


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