
Benutzer441521
Wie kann ich eine normale (nicht statische) Klassenfunktion mit ihrem Namen aufrufen?
Das Folgende gibt einen Fehler aus, der besagt, dass Param 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, waren statisch.
class Player
{
public function SayHi() { print("Hi"); }
}
$player = new Player();
call_user_func($Player, 'SayHi');

Raketen-Hazmat
Der callback
Syntax ist ein wenig seltsam in PHP. Was Sie tun müssen, ist ein Array zu erstellen. Das erste Element ist das Objekt und das zweite die Methode.
call_user_func(array($player, 'SayHi'));
Geht auch ohne call_user_func
:
$player->{'SayHi'}();
Oder:
$method = 'SayHi';
$player->$method();
Sie müssen das Objekt und die Methode zusammen als Array übergeben:
call_user_func(array($Player, 'SayHi'));
Sehen Rückrufe, konkret:
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

Toskanisch
Ich gebe hier meine Antwort auf eine andere Frage ( PHP – Können Sie einer Variablen eine Member-Funktion zuweisen? ), weil sie von einigen Stackoverflow-Radikalen als Duplikat markiert wurde, und ich kann meine Antwort auf seine Frage nicht geben! Die Mentalität der Stackoverflow-Fanatiker muss aufhören.
Übrigens ist dies im Allgemeinen ein Anti-Muster:
$a="Pl";
$b = 'aye';
$c="r";
$z = $a . $b . $c;
$myz = new $z();
$d = 'Say';
$e="Hi";
$x = $d.$e;
$myz->{$x}()
Verteilen Sie nun alle Variablen über Ihren Code. Du bist der Antichrist geworden.
Warum? weil niemand mehr Ihren Code lesen kann. Auch dich selbst.
Besser ist es, in Ihrem Code die tatsächlichen Verweise auf die von Ihnen getätigten Funktionsaufrufe zu haben. Nicht in irgendwelchen obskuren Saiten versteckt. Nein, nur Standardaufrufe des Codes, verpackt in eine Funktion.
Versuchen Sie es so einfach wie möglich zu halten. Eine bessere Lösung wäre also diese:
$x = function(){
$player = new Player();
$player->sayHi();
};
$x();
Ihre IDE findet diese Referenzen. $myz->{$x}()
Ihre IDE wird nicht finden und Sie können Ihren Code nicht gut pflegen
Ich wollte eine Antwort für Leute hinzufügen, die eine Klassenfunktion haben, die auch Argumente hat:
class Player{
public function Say($what){ print($what); }
}
$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi' ] );
Wenn Sie mehr Argumente in Ihrer Funktion Player haben, können Sie sie in das zweite Array von call_user_func_array einfügen:
class Player{
public function Say($what,$end){ print($what.$end); }
}
$player = new Player();
call_user_func_array( [ $player, 'Say' ], [ 'Hi','gh' ] );
Sie erstellen sowieso ein Objekt der Klasse, sodass Sie object 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'));

zeyorama
$player->SayHi();
Ich bevorzuge diese Form.
.
5381000cookie-checkphp Klassenfunktion nach Stringnamen aufrufenyes
Lesen Sie Beispiel 4 in ihrer Dokumentation: php.net/manual/en/function.call-user-func.php
– Matthew
24. Mai ’13 um 17:02 Uhr
Ich wundere mich, dass es sich nicht über den Fall beschwert. Sie deklarieren “Spieler”, rufen aber “Spieler” mit einem großen “P” an.
– Drazen
24. Mai ’13 um 17:05 Uhr
@drale2k: Es ist Jammern. “param 1 muss ein gültiger Callback sein”
– Raketen-Hazmat
24. Mai ’13 um 17:07 Uhr
Entschuldigung, nur ein Tippfehler auf dieser Seite auf dem P vs p. @Rocket, ich verstehe das, habe mich aber gefragt, wie ich es in der PHP-Syntax beheben würde, wie die Antworten unten mir gegeben haben.
– Benutzer441521
24. Mai ’13 um 17:22 Uhr
Dies hat bei mir funktioniert und zeigt, dass mehrere Methoden sogar Geschwindigkeitsunterschiede zwischen ihnen nahelegen: designcise.com/web/tutorial/…
– Armando
25. Juni 19 um 15:37 Uhr