2010-04-17 14 views
24

Ist es möglich, Funktionen von Klasse wie folgt zu nennen:OOP in PHP: Klassenfunktion aus einer Variablen?

$class = new class; 
$function_name = "do_the_thing"; 
$req = $class->$function_name(); 

Etwas ähnliche Lösung, dies scheint nicht zu arbeiten?

+0

möglich Duplikat http://stackoverflow.com/questions/936875/how-would-i-call-a-method-from-a-class-with-a-variable – outis

Antwort

50

Ja, ist es möglich, dass ist bekannt als variable Funktionen, hat ein look at this.

Beispiel von PHP offizieller Website:

<?php 
class Foo 
{ 
    function Variable() 
    { 
     $name = 'Bar'; 
     $this->$name(); // This calls the Bar() method 
    } 

    function Bar() 
    { 
     echo "This is Bar"; 
    } 
} 

$foo = new Foo(); 
$funcname = "Variable"; 
$foo->$funcname(); // This calls $foo->Variable() 

?> 

In Ihrem Fall, stellen Sie sicher, dass Die Funktion do_the_thing existiert. Beachten Sie auch, dass Sie den Rückgabewert der Funktion werden die Speicherung:

$req = $class->$function_name(); 

Versuch zu sehen, was die Variable $req enthält. Zum Beispiel sollte diese geben Sie info:

print_r($req); // or simple echo as per return value of your function 

Hinweis:

Variable Funktionen werden nicht mit Sprachkonstrukte wie echo(), print(), unset(), isset(), empty(), include(), require() und dergleichen arbeiten. Verwenden Sie Wrapper-Funktionen, um eines dieser Konstrukte als variable Funktionen zu verwenden.

+2

+1 für Informationen in Hinweis. – MAS1

+0

@ MAS1: Ja, es ist sehr wichtig :) – Sarfraz

+0

Danke, eine nette und detaillierte Antwort! :) –

4

Mein einfachste Beispiel ist:

$class = new class; 
$function_name = "do_the_thing"; 
$req = $class->${$function_name}(); 

$ {$ function_name} ist der Trick

auch mit statischen Methoden funktioniert:

$req = $class::{$function_name}(); 
+1

Ich bekomme einen Fehler mit $ req = $ class -> $ {$ function_name}(); Allerdings scheint das Folgende die korrekte Syntax zu sein $ req = $ class -> {$ function_name}(); – Martin

+0

danke @Martin für die Lösung. Ich werde erneut mit dem Code überprüfen müssen, woher es kommt, um zu sehen, warum ich diesen Fehler hatte. – Tudor

+0

Methoden mit variablen Variablen, nett! – Wietse