So rufen Sie die PHP-function aus einer in einer Variablen gespeicherten Zeichenfolge auf

Ich muss eine function aufrufen können, aber der functionsname wird in einer Variablen gespeichert, ist das möglich? z.B:

 function foo ()
 {
   // Code hier
 }

 functionsleiste ()
 {
   // Code hier
 }

 $ funktionName = "foo";
 // Ich muss die function aufrufen, basierend auf $ functionName

Jede Hilfe wäre großartig.

Vielen Dank!

$functionName() oder call_user_func($functionName)

Meine Lieblingsversion ist die Inline-Version:

 ${"variableName"} = 12; $className->{"variableName"}; $className->{"methodName"}(); StaticClass::${"variableName"}; StaticClass::{"methodName"}(); 

Sie können auch Variablen oder Ausdrücke innerhalb der Klammern platzieren!

Ja, es ist möglich:

 function foo($msg) { echo $msg."
"; } $var1 = "foo"; $var1("testing 1,2,3");

Quelle: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2

Wie bereits erwähnt, gibt es ein paar Möglichkeiten, dies zu erreichen, wobei möglicherweise die sicherste Methode call_user_func() oder wenn Sie müssen, können Sie auch die Route von $function_name() hinuntergehen. Es ist möglich, Argumente mit diesen beiden Methoden zu übergeben

 $function_name = 'foobar'; $function_name(arg1, arg2); call_user_func_array($function_name, array(arg1, arg2)); 

Wenn die function, die Sie anrufen, zu einem Objekt gehört, können Sie immer noch eines dieser Objekte verwenden

 $object->$function_name(arg1, arg2); call_user_func_array(array($object, $function_name), array(arg1, arg2)); 

Wenn Sie jedoch die $function_name() -Methode verwenden möchten, empfiehlt es sich, das Vorhandensein der function zu testen, wenn der Name in irgendeiner Weise dynamisch ist

 if(method_exists($object, $function_name)) { $object->$function_name(arg1, arg2); } 

Falls jemand anderes von Google hierher gebracht wird, weil er versuchte, eine Variable für eine Methode innerhalb einer class zu verwenden, ist das folgende ein Codebeispiel, das tatsächlich funktioniert. Keines der oben genannten Dinge funktionierte für meine Situation. Der Hauptunterschied ist das & in der Deklaration von $c = & new... und &$c , die in call_user_func .

Mein spezieller Fall ist, wenn jemand Code implementiert, der mit colors zu tun hat, und zwei Member-Methoden lighten() und darken darken() aus der class csscolor.php. Aus irgendeinem Grund wollte ich den gleichen Code in der Lage sein, hell oder dunkel zu nennen, anstatt ihn mit Logik auszuwählen. Dies kann das Ergebnis meiner Hartnäckigkeit sein, nicht nur wenn-sonst zu verwenden oder den Code zu ändern, der diese Methode aufruft.

 $lightdark="lighten"; // or optionally can be darken $color="fcc"; // a hex color $percent=0.15; include_once("csscolor.php"); $c = & new CSS_Color($color); $rtn=call_user_func( array(&$c,$lightdark),$color,$percent); 

Beachten Sie, dass das Versuchen von irgendetwas mit $c->{...} nicht funktionierte. Nachdem ich den von den Lesern beigesteuerten Inhalt unten auf der Seite von call_user_func auf call_user_func , war ich in der Lage, das Obige zusammenzusetzen. Beachten Sie auch, dass $params als Array für mich nicht funktionierte :

 // This doesn't work: $params=Array($color,$percent); $rtn=call_user_func( array(&$c,$lightdark),$params); 

Dieser obige Versuch würde eine Warnung über die Methode geben, die ein zweites Argument (Prozent) erwartet.

Ein paar Jahre zu spät, aber das ist die beste Art und Weise jetzt imho:

 $x = (new ReflectionFunction("foo"))->getClosure(); $x(); 

Der Vollständigkeit halber können Sie auch eval () verwenden :

 $functionName = "foo()"; eval($functionName); 

call_user_func() ist jedoch der richtige Weg.

Dynamische functionsnamen und Namespaces

Nur um einen Punkt über dynamische functionsnamen bei der Verwendung von Namespaces hinzuzufügen.

Wenn Sie Namespaces verwenden, funktioniert Folgendes nicht, außer wenn sich Ihre function im globalen Namespace befindet:

 namespace greetings; function hello() { // do something } $myvar = "hello"; $myvar(); // interpreted as "\hello();" 

Was ist zu tun?

Sie müssen stattdessen call_user_func() verwenden:

 // if hello() is in the current namespace call_user_func(__NAMESPACE__.'\\'.$myvar); // if hello() is in another namespace call_user_func('mynamespace\\'.$myvar); 

Ergänzen Sie die Antwort von @Chris K. Wenn Sie die Methode eines Objekts aufrufen möchten, können Sie sie mit Hilfe einer Closure mit einer einzigen Variablen aufrufen:

 function get_method($object, $method){ return function() use($object, $method){ $args = func_get_args(); return call_user_func_array(array($object, $method), $args); }; } class test{ function echo_this($text){ echo $text; } } $test = new test(); $echo = get_method($test, 'echo_this'); $echo('Hello'); //Output is "Hello" 

Ich habe hier ein anderes Beispiel veröffentlicht

Verwenden Sie die function call_user_func.

Der folgende Code kann helfen, dynamische functionen in PHP zu schreiben. Jetzt kann der functionsname dynamisch durch die Variable ‘$ current_page’ geändert werden.

 $current_page = 'home_page'; $function = @${$current_page . '_page_versions'}; $function = function() { echo 'current page'; }; $function(); 

Eine unkonventionelle Herangehensweise, die mir in den Sinn kam, ist, dass , wenn Sie nicht den gesamten Code durch eine super ultra-autonome KI erzeugen, die sich selbst schreibt , die Wahrscheinlichkeit hoch ist, dass die functionen, die Sie “dynamisch” aufrufen möchten, bereits in Ihrem Code definiert sind Base. Also, warum nicht einfach nach der Saite ifelse und den berüchtigten ifelse Tanz machen, um die … zu beschwören ifelse

z.B.

 if($functionName == 'foo'){ foo(); } else if($functionName == 'bar'){ bar(); } 

Sogar ein switch-case kann verwendet werden, wenn Sie den geschmacklosen Geschmack der ifelse Leiter nicht mögen.

Ich verstehe, dass es Fälle gibt, in denen das ” dynamische Aufrufen der function ” 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.

Dadurch wird eine große Unsicherheit in Ihrer Anwendung vermieden und Sie können eine Fallback-function ausführen, wenn die Zeichenfolge nicht mit der Definition der verfügbaren functionen übereinstimmt. MEINER BESCHEIDENEN MEINUNG NACH.

Ich weiß nicht, warum du das verwenden musst, klingt überhaupt nicht gut für mich, aber wenn es nur eine kleine Anzahl von functionen gibt, könntest du ein if / elseif-Konstrukt verwenden. Ich weiß nicht, ob eine direkte Lösung möglich ist.

etwas wie $ foo = “bar”; $ test = “foo”; Echo $$ Test;

sollte bar zurückgeben, können Sie versuchen, aber ich denke nicht, dass dies für functionen funktioniert