Ich muss in der Lage sein, eine Funktion aufzurufen, aber der Funktionsname ist in einer Variablen gespeichert. Ist dies möglich? z.B:
Funktion foo () { // Code hier }} Funktionsleiste () { // Code hier }} $ functionName = "foo"; // Ich muss die Funktion basierend auf $ functionName aufrufen
php
dynamic-function
Eidechse
quelle
quelle
is_callable
Funktion verwenden. Es wird geprüft, ob eine Variable etwas enthält, das als Funktion aufgerufen werden kann (sei es der Name einer Funktion, ein Array, das eine Objektinstanz und einen Funktionsnamen enthält, oder eine anonyme Funktion / Schließung)call_user_func(array('ClassName', 'method'), $args)
Meine Lieblingsversion ist die Inline-Version:
Sie können auch Variablen oder Ausdrücke in die Klammern setzen!
quelle
{"functionName"}();
ist nicht legal und löst einen Syntaxfehler aus.Ja, es ist möglich:
Quelle: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
quelle
Wie bereits erwähnt, gibt es einige Möglichkeiten, dies mit der möglicherweise sichersten Methode zu erreichen,
call_user_func()
oder wenn Sie müssen, können Sie auch den Weg von gehen$function_name()
. Es ist möglich, Argumente mit diesen beiden Methoden zu übergebenWenn die von Ihnen aufgerufene Funktion zu einem Objekt gehört, können Sie beide verwenden
Wenn Sie jedoch die
$function_name()
Methode verwenden möchten, ist es möglicherweise eine gute Idee, die Existenz der Funktion zu testen, wenn der Name in irgendeiner Weise dynamisch istquelle
Falls jemand anderes von Google hierher gebracht wird, weil er versucht hat, eine Variable für eine Methode innerhalb einer Klasse zu verwenden, ist das folgende Codebeispiel, das tatsächlich funktioniert. Keiner der oben genannten Punkte hat für meine Situation funktioniert. Der Hauptunterschied besteht
&
in der Erklärung$c = & new...
und&$c
Weitergabecall_user_func
.Mein spezieller Fall ist, wenn jemandes Code implementiert wird, der mit Farben und zwei Mitgliedsmethoden
lighten()
unddarken()
aus der Klasse csscolor.php zu tun hat . Aus irgendeinem Grund wollte ich, dass derselbe Code in der Lage ist, Aufhellen oder Abdunkeln aufzurufen, anstatt ihn mit Logik auszuwählen. Dies kann das Ergebnis meiner Sturheit sein, nicht nur if-else zu verwenden oder den Code zu ändern, der diese Methode aufruft.Beachten Sie, dass das Ausprobieren
$c->{...}
nicht funktioniert hat. Nachdem ich den vom Leser bereitgestellten Inhalt am Ende der Seite von php.net gelesen hattecall_user_func
, konnte ich das Obige zusammenfügen. Beachten Sie auch, dass$params
ein Array bei mir nicht funktioniert hat:Dieser obige Versuch würde eine Warnung über die Methode geben, die ein zweites Argument (Prozent) erwartet.
quelle
Ein paar Jahre zu spät, aber das ist jetzt imho die beste Art:
quelle
Der Vollständigkeit halber können Sie auch eval () verwenden :
Ist
call_user_func()
jedoch der richtige Weg.quelle
eval
ist keine Lösung für diese Frage.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:
Beispielsweise:
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):
Sehen Sie es in einem Beispiel:
Dynamischer Methodenaufruf: Die Array-Syntax
Ein eleganterer Weg, der in PHP7 hinzugefügt wird, ist der folgende:
Als Beispiel:
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:
TL; DR (Schlussfolgerung)
Im Allgemeinen sind in PHP7 alle folgenden Formulare möglich:
Hauptsächlich basierend auf diesem PHP-Vortrag .
quelle
(expressions)->$bar()
Dynamische Funktionsnamen und Namespaces
Nur um einen Punkt über dynamische Funktionsnamen hinzuzufügen, wenn Namespaces verwendet werden.
Wenn Sie Namespaces verwenden, funktioniert Folgendes nur, wenn sich Ihre Funktion im globalen Namespace befindet:
Was ist zu tun?
Sie müssen
call_user_func()
stattdessen verwenden:quelle
Wenn Sie die Antwort von @Chris K ergänzen und die Methode eines Objekts aufrufen möchten, können Sie sie mit Hilfe eines Abschlusses mithilfe einer einzelnen Variablen aufrufen:
Ich habe hier ein weiteres Beispiel gepostet
quelle
Was ich aus dieser Frage und den Antworten gelernt habe. Vielen Dank an alle!
Angenommen, ich habe diese Variablen und Funktionen:
Funktion ohne Argumente aufrufen
Funktion mit 1 Argument aufrufen
So rufen Sie eine Funktion mit einem oder mehreren Argumenten auf Dies ist nützlich, wenn Sie Ihre Funktionen dynamisch aufrufen und jede Funktion eine andere Anzahl von Argumenten hat. Dies ist mein Fall, den ich gesucht (und gelöst) habe.
call_user_func_array
ist der SchlüsselYay bye!
quelle
Verwenden Sie die Funktion call_user_func.
quelle
Der folgende Code kann helfen, dynamische Funktionen in PHP zu schreiben. Jetzt kann der Funktionsname durch die Variable '$ current_page' dynamisch geändert werden.
quelle
$function
Variablen ohne Angabe von Gründen.Der einfachste Weg, eine Funktion sicher unter Verwendung des in einer Variablen gespeicherten Namens aufzurufen, ist:
Ich habe wie unten verwendet, um Migrationstabellen in Laravel dynamisch zu erstellen.
quelle
Ein unkonventioneller Ansatz, der mir in den Sinn kam, ist, dass die Funktionen, die Sie "dynamisch" aufrufen möchten, bereits in Ihrem Code definiert sind, es sei denn, Sie generieren den gesamten Code durch eine superautonome KI, die sich selbst schreibt Base. Warum also nicht einfach nach der Saite suchen und das berüchtigte tun?
ifelse
Tanz machen, um die ... du verstehst, was ich meine?z.B.
Sogar
switch-case
kann verwendet werden , wenn Sie den milden Geschmack von nicht wie tunifelse
Leiter.Ich verstehe, dass es Fälle gibt, in denen die Funktion dynamisch aufgerufen wird " eine absolute Notwendigkeit wäre ( wie eine rekursive Logik, die sich selbst modifiziert ). Aber die meisten alltäglichen trivialen Anwendungsfälle können einfach ausgewichen werden.
Es beseitigt eine Menge Unsicherheiten in Ihrer Anwendung und gibt Ihnen die Möglichkeit, eine Fallback-Funktion auszuführen, wenn die Zeichenfolge keiner der verfügbaren Funktionsdefinitionen entspricht. MEINER BESCHEIDENEN MEINUNG NACH.
quelle
if (method_exists($functionName)) $functionName(); else //exception or handle
Ich weiß nicht, warum du das verwenden musst, klingt für mich überhaupt nicht so gut, aber wenn es nur eine kleine Anzahl von Funktionen gibt, könntest du ein if / elseif-Konstrukt verwenden. Ich weiß nicht, ob eine direkte Lösung möglich ist.
so etwas wie $ foo = "bar"; $ test = "foo"; echo $$ test;
Sollte die Leiste zurückgegeben werden, können Sie es versuchen, aber ich glaube nicht, dass dies für Funktionen funktioniert
quelle