2013-05-24 13 views
33

Wie kann ich eine normale (nicht statische) Klassenfunktion mit ihrem Namen aufrufen?php call class function nach String-Name

Die folgende Fehlermeldung gibt an, dass Parameter 1 ein gültiger Rückruf sein muss. Ich möchte nicht, dass die Funktion statisch ist, ich möchte, dass sie eine normale Funktion ist, und alle Beispiele, die ich bisher gesehen habe, hatten sie statisch.

class Player 
{ 
    public function SayHi() { print("Hi"); } 
} 

$player = new Player(); 

call_user_func($Player, 'SayHi'); 
+0

lesen Beispiel 4 auf ihre Dokumentation: http://php.net/manual/en/function .call-user-func.php – Matthew

+0

Ich wundere mich, dass es sich nicht über den Fall beschwert. Sie deklarieren "Spieler", rufen aber "Spieler" mit einem großen "P" auf. –

+0

@ drale2k: Es * beschwert sich *. "param 1 muss ein gültiger Rückruf sein" –

Antwort

68

callback Die Syntax ist ein wenig odd in PHP. Was Sie tun müssen, ist ein Array zu machen. Das erste Element ist das Objekt und das zweite ist die Methode.

call_user_func(array($player, 'SayHi')); 

Sie können es auch tun, ohne call_user_func:

$player->{'SayHi'}(); 

Oder:

$method = 'SayHi'; 
$player->$method(); 
+0

Super danke! –

7

Sie müssen das Objekt und Verfahren zusammen als ein Array zu übergeben:

call_user_func(array($Player, 'SayHi')); 

callbacks See, speziell:

// Type 3: Object method call 
$obj = new MyClass(); 
call_user_func(array($obj, 'myCallbackMethod')); 
-8

$player->SayHi();

ich diese Form bevorzugen.

+4

Und doch beantwortet das nicht im Entferntesten die Frage. -1 –

+4

Der Punkt ist, dass "SayHi" eine Zeichenfolge ist. –

+1

Du meintest '$ player -> $ SayHi()'? – greenoldman

0

Sie erstellen auf jeden Fall ein Objekt der Klasse, so dass Sie Objekt verwenden können, um seine Funktion aufzurufen.

$player = new Player(); 
$player->SayHi(); 

oder Rückruf verwenden

$player = new Player(); 
call_user_func(array($player, 'SayHi')); 
+1

Das war nur ein Beispiel. Ich muss die Objekte und ihre Funktionen als Callbacks speichern, die von einem anderen System ausgelöst werden, aber ich wollte diesen Code nicht eingeben. – user441521

+0

sehe meine bearbeitete Antwort – Nagarjun

Verwandte Themen