Soluzione: utilizzare PHP7
Nota: per una versione riepilogata, vedere TL; DR alla fine della risposta.
Metodi antichi
Aggiornamento : uno dei vecchi metodi spiegati qui è stato rimosso. Fare riferimento ad altre risposte per spiegazioni su altri metodi, non è trattato qui. A proposito, se questa risposta non ti aiuta, dovresti tornare ad aggiornare le tue cose. Il supporto di PHP 5.6 è terminato a gennaio 2019 (ora anche PHP 7.0 e 7.1 non sono supportati). Vedi le versioni supportate per ulteriori informazioni.
Come altri hanno già detto, in PHP5 (e anche nelle versioni più recenti come PHP7) potremmo usare le variabili come nomi di funzione, uso call_user_func()
e call_user_func_array()
(che, personalmente, odio quelle funzioni), ecc.
Nuovi metodi
A partire da PHP7, ci sono nuovi modi introdotti:
Nota: tutto tra <something>
parentesi indica una o più espressioni per formare qualcosa, ad es. <function_name>
Espressioni che formano un nome di funzione.
Chiamata dinamica delle funzioni: nome della funzione al volo
Possiamo usare una o più espressioni tra parentesi come nome della funzione in una sola volta, sotto forma di:
(<function_name>)(arguments);
Per esempio:
function something(): string
{
return "something";
}
$bar = "some_thing";
(str_replace("_", "", $bar))(); // something
// Possible, too; but generally, not recommended, because makes your code more complicated
(str_replace("_", "", $bar))()();
Nota: sebbene rimuovere le parentesi str_replace()
non sia un errore, l'inserimento di parentesi rende il codice più leggibile. Tuttavia, a volte non è possibile farlo, ad esempio durante l'utilizzo .
dell'operatore. Per essere coerenti, ti consiglio di mettere sempre le parentesi.
Chiamata dinamica al metodo: nome del metodo al volo
Proprio come le chiamate di funzione dinamiche, possiamo fare lo stesso con le chiamate di metodo, circondate da parentesi graffe anziché da parentesi (per i moduli extra, vai alla sezione TL; DR):
$object->{<method_name>}(arguments);
$object::{<method_name>}(arguments);
Guardalo in un esempio:
class Foo
{
public function another(): string
{
return "something";
}
}
$bar = "another thing";
(new Something())->{explode(" ", $bar)[0]}(); // something
Chiamata a metodo dinamico: la sintassi dell'array
Un modo più elegante aggiunto in PHP7 è il seguente:
[<object>, <method_name>](arguments);
[<class_name>, <method_name>](arguments); // Static calls only
Come esempio:
class Foo
{
public function nonStaticCall()
{
echo "Non-static call";
}
public static function staticCall()
{
echo "Static call";
}
}
$x = new X();
[$x, "non" . "StaticCall"](); // Non-static call
[$x, "static" . "Call"](); // Static call
Nota: il vantaggio di utilizzare questo metodo rispetto al precedente è che non ti interessa il tipo di chiamata (ovvero se è statico o meno).
Esempio aggiuntivo: utilizzo di classi anonime
Rendendo le cose un po 'complicate, potresti usare una combinazione di classi anonime e le funzionalità sopra:
$bar = "SomeThing";
echo (new class {
public function something()
{
return 512;
}
})->{strtolower($bar)}(); // 512
TL; DR (conclusione)
Generalmente, in PHP7, sono possibili tutti i seguenti moduli:
// Everything inside `<something>` brackets means one or more expressions
// to form something
// Dynamic function call
(<function_name>)(arguments)
// Dynamic method call on an object
$object->{<method_name>}(arguments)
$object::{<method_name>}(arguments)
// Dynamic method call on a dynamically-generated object
(<object>)->{<method_name>}(arguments)
(<object>)::{<method_name>}(arguments)
// Dynamic method call, statically
ClassName::{<method_name>}(arguments)
(<class_name>)::{<method_name>}(arguments)
// Dynamic method call, array-like (no different between static and non-static calls
[<object>, <method_name>](arguments)
// Dynamic method call, array-like, statically
[<class_name>, <method_name>](arguments)
Basato principalmente su questo discorso di PHP .