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

А именно, еще одно эффективное, чем другой?

12
задан Charles 24 December 2012 в 21:21
поделиться

1 ответ

Существует, по крайней мере, два отличия между forward _ static _ call _ array и call _ user _ func _ array :

  • Первая существует только с 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."


Если вы попытаетесь сделать то же самое с вызовите _ 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 - нет.


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

11
ответ дан 2 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: