Solution: utilisez PHP7
Remarque: Pour une version résumée, voir TL; DR à la fin de la réponse.
Anciennes méthodes
Mise à jour : l'une des anciennes méthodes expliquées ici a été supprimée. Reportez-vous à d'autres réponses pour obtenir des explications sur d'autres méthodes, elles ne sont pas traitées ici. Soit dit en passant, si cette réponse ne vous aide pas, vous devriez retourner la mise à niveau de votre contenu. Le support de PHP 5.6 a pris fin en janvier 2019 (désormais même PHP 7.0 et 7.1 ne sont plus pris en charge). Voir les versions prises en charge pour plus d'informations.
Comme d'autres l'ont mentionné, en PHP5 (et également dans les versions plus récentes comme PHP7), nous pourrions utiliser des variables comme noms de fonction, utiliser call_user_func()
et call_user_func_array()
(qui, personnellement, je déteste ces fonctions), etc.
De nouvelles méthodes
Depuis PHP7, de nouvelles méthodes ont été introduites:
Remarque: tout ce qui se trouve <something>
entre crochets signifie une ou plusieurs expressions pour former quelque chose, par exemple <function_name>
, des expressions formant un nom de fonction.
Appel de fonction dynamique: nom de la fonction à la volée
Nous pouvons utiliser une ou plusieurs expressions entre parenthèses comme nom de fonction en une seule fois, sous la forme de:
(<function_name>)(arguments);
Par exemple:
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))()();
Remarque: Bien que la suppression des parenthèses autour str_replace()
ne soit pas une erreur, la mise en parenthèses rend le code plus lisible. Cependant, vous ne pouvez pas le faire parfois, par exemple lorsque vous utilisez l' .
opérateur. Pour être cohérent, je vous recommande de toujours mettre les parenthèses.
Appel de méthode dynamique: nom de méthode à la volée
Tout comme les appels de fonction dynamiques, nous pouvons faire de même avec les appels de méthode, entourés d'accolades au lieu de parenthèses (pour les formulaires supplémentaires, accédez à TL; section DR):
$object->{<method_name>}(arguments);
$object::{<method_name>}(arguments);
Voyez-le dans un exemple:
class Foo
{
public function another(): string
{
return "something";
}
}
$bar = "another thing";
(new Something())->{explode(" ", $bar)[0]}(); // something
Appel de méthode dynamique: la syntaxe du tableau
Une manière plus élégante ajoutée en PHP7 est la suivante:
[<object>, <method_name>](arguments);
[<class_name>, <method_name>](arguments); // Static calls only
Par exemple:
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
Remarque: L'avantage d'utiliser cette méthode par rapport à la précédente est que vous ne vous souciez pas du type d'appel (c'est-à-dire qu'il soit statique ou non).
Exemple supplémentaire: utilisation de classes anonymes
Pour compliquer les choses, vous pouvez utiliser une combinaison de classes anonymes et des fonctionnalités ci-dessus:
$bar = "SomeThing";
echo (new class {
public function something()
{
return 512;
}
})->{strtolower($bar)}(); // 512
TL; DR (Conclusion)
Généralement, en PHP7, l'utilisation des formes suivantes est possible:
// 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)
Basé principalement sur cette conversation PHP .