No PHP, existem vantagens em usar o Forward_static_call_array () em vez de call_user_func_array () ao chamar dinamicamente um método estático?

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

  •  23-09-2019
  •  | 
  •  

Pergunta

Especificamente, é mais eficiente que o outro?

Foi útil?

Solução

Há em Leat duas diferenças entre forward_static_call_array e call_user_func_array :

  • O primeiro só existe desde o Php 5.3
  • O primeiro deve ser chamado de dentro de uma aula

Depois disso, suponho que haja alguma diferença relacionada à ligação estática tardia, que foi introduzida com o PHP 5.3.


Na verdade, se você analisar mais de perto o exemplo dado, parece ser exatamente isso: o "contexto" da classe dentro do qual você está usando forward_static_call_array é "mantido", no método chamado.

Considerando esta parte do código, deriva do exemplo dado:

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');

Você obterá esta saída:

B
B more,args

ou seja, do método da classe A, você "sabe", via o static:: Palavra -chave, que você está "vindo de B".


Agora, se você tentar fazer a mesma coisa com 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'));
    }
}

(o restante do código não muda)

Você obterá esta saída:

B
A more,args

Note o UMA Na segunda linha! Com forward_static_call_array, você não conseguiu um UMA, mas a B.

Essa é a diferença: forward_static_call_array encaminha o contexto estático para o método chamado, enquanto call_user_func_array não.


Sobre sua pergunta de eficiência: não tenho ideia - você teria que comparecer; Mas esse não é realmente o ponto: o ponto é que essas duas funções não fazem a mesma coisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top