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

StackOverflow https://stackoverflow.com/questions/2343974

  •  23-09-2019
  •  | 
  •  

Вопрос

В частности, является ли один более эффективным, чем другой?

Это было полезно?

Решение

Существует как минимум два различия между 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

то естьиз метода класса А, вы «знаете», через static:: ключевое слово, что вы «пришли из Б».


Теперь, если вы попытаетесь сделать то же самое с 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

Обратите внимание А на второй линии!С forward_static_call_array, ты не получил А, но Б.

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top