In PHP, ci sono dei vantaggi ad usare forward_static_call_array () al posto di call_user_func_array () quando si chiama in modo dinamico un metodo statico?

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

  •  23-09-2019
  •  | 
  •  

Domanda

In particolare, è una più efficiente rispetto agli altri?

È stato utile?

Soluzione

Non v'è almeno di due differenze tra forward_static_call_array e call_user_func_array :

  • La prima esiste solo dal PHP 5.3
  • Il primo deve essere chiamato dall'interno di una classe

Dopo di che, suppongo che ci sia qualche differenza che è legato al ritardo binding statico, che è stato introdotto con PHP 5.3.


In realtà, se si dà un'occhiata più da vicino l'esempio dato, sembra che sia esattamente questo:. Il "contesto" della classe all'interno della quale si sta utilizzando forward_static_call_array è "mantenuto", nel metodo chiamato

Considerando questa porzione di codice, che è derivato dal esempio fornito:

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

Si otterrà questo output:

B
B more,args

vale a dire. dal metodo in classe A, si "sa", tramite la parola chiave static::, che si sta "venendo da B".


Ora, se si tenta di fare la stessa cosa con la 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'));
    }
}

(il resto del codice non cambia)

Si otterrà questo output:

B
A more,args

Si noti la A sulla seconda linea! Con forward_static_call_array, non ha ottenuto un A , ma un B .

Questa è la differenza: forward_static_call_array inoltra contesto statico per il metodo che si chiama, mentre call_user_func_array no

.


A proposito di tua domanda efficienza: non ho idea - sarebbe necessario punto di riferimento; ma questo è davvero non è il punto. Il punto è che queste due funzioni non fanno la stessa cosa

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top