php Klassenfunktion nach Stringnamen aufrufen

Lesezeit: 4 Minuten

php Klassenfunktion nach Stringnamen aufrufen
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');

  • 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


php Klassenfunktion nach Stringnamen aufrufen
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();

  • Bitte ist das dritte Beispiel mit einem bestimmten Namen gekennzeichnet?

    – Marco Dufal

    16. April 18 um 3:47 Uhr

  • Wie heißt die zweite Methode?

    – Zach

    8. Mai 18 um 14:11 Uhr

  • @Zack Ich weiß, es ist vielleicht etwas spät, aber für zukünftige Leute heißt das variable functions Handbuch und für Variablen aufgerufen wird variables variable Handbuch

    – rkd.me

    29. August 2020 um 21:19 Uhr

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'));

1642536727 870 php Klassenfunktion nach Stringnamen aufrufen
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'));

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

    – Benutzer441521

    24. Mai ’13 um 17:05 Uhr


php Klassenfunktion nach Stringnamen aufrufen
zeyorama

$player->SayHi();

Ich bevorzuge diese Form.

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

    – Benutzer441521

    24. Mai ’13 um 17:05 Uhr


.

538100cookie-checkphp Klassenfunktion nach Stringnamen aufrufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy