Lösung: Verwenden Sie PHP7
Hinweis: Eine zusammengefasste Version finden Sie unter TL; DR am Ende der Antwort.
Alte Methoden
Update : Eine der hier erläuterten alten Methoden wurde entfernt. Weitere Erläuterungen zu anderen Methoden finden Sie in anderen Antworten. Diese werden hier nicht behandelt. Übrigens, wenn diese Antwort Ihnen nicht hilft, sollten Sie Ihre Inhalte erneut aktualisieren. Die Unterstützung für PHP 5.6 wurde im Januar 2019 beendet (jetzt werden sogar PHP 7.0 und 7.1 nicht mehr unterstützt). Siehe unterstützte VersionenWeitere Informationen finden .
Wie bereits erwähnt, könnten wir in PHP5 (und auch in neueren Versionen wie PHP7) Variablen als Funktionsnamen verwenden, verwenden call_user_func()
undcall_user_func_array()
(was ich persönlich hasse, diese Funktionen) usw.
Neue Methoden
Ab PHP7 wurden neue Möglichkeiten eingeführt:
Hinweis: Alles in <something>
Klammern bedeutet einen oder mehrere Ausdrücke, um etwas zu bilden, z. B. <function_name>
Ausdrücke, die einen Funktionsnamen bilden.
Dynamischer Funktionsaufruf: Funktionsname On-the-Fly
Wir können einen oder mehrere Ausdrücke in Klammern als Funktionsnamen in nur einem Durchgang verwenden, und zwar in Form von:
(<function_name>)(arguments);
Beispielsweise:
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))()();
Hinweis: Obwohl das Entfernen der Klammern str_replace()
kein Fehler ist, macht das Setzen von Klammern den Code lesbarer. Dies ist jedoch manchmal nicht möglich, z. B. während der Verwendung.
. Operator verwenden. Um konsistent zu sein, empfehle ich Ihnen, die Klammern immer zu setzen.
Dynamischer Methodenaufruf: Methodenname On-the-Fly
Genau wie bei dynamischen Funktionsaufrufen können wir dies auch mit Methodenaufrufen tun, die von geschweiften Klammern anstelle von Klammern umgeben sind (für zusätzliche Formulare navigieren Sie zum Abschnitt TL; DR):
$object->{<method_name>}(arguments);
$object::{<method_name>}(arguments);
Sehen Sie es in einem Beispiel:
class Foo
{
public function another(): string
{
return "something";
}
}
$bar = "another thing";
(new Something())->{explode(" ", $bar)[0]}(); // something
Dynamischer Methodenaufruf: Die Array-Syntax
Ein eleganterer Weg, der in PHP7 hinzugefügt wird, ist der folgende:
[<object>, <method_name>](arguments);
[<class_name>, <method_name>](arguments); // Static calls only
Als Beispiel:
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
Hinweis: Der Vorteil dieser Methode gegenüber der vorherigen besteht darin, dass Sie sich nicht für den Anruftyp interessieren (dh ob er statisch ist oder nicht).
Zusätzliches Beispiel: Verwenden anonymer Klassen
Um die Dinge etwas komplizierter zu machen, können Sie eine Kombination aus anonymen Klassen und den oben genannten Funktionen verwenden:
$bar = "SomeThing";
echo (new class {
public function something()
{
return 512;
}
})->{strtolower($bar)}(); // 512
TL; DR (Schlussfolgerung)
Im Allgemeinen sind in PHP7 alle folgenden Formulare möglich:
// 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)
Hauptsächlich basierend auf diesem PHP-Vortrag .