Wie fange ich einen Methodenaufruf für ein Objekt in PHP ab?
-
15-09-2020 - |
Frage
Ich versuche herauszufinden, wie man eine Methode abfängt, die für ein Objekt in PHP aufgerufen wird.Ich kenne die magische Funktion __call
, aber es wird nur für Methoden ausgelöst, die auf dem aufgerufenen Objekt nicht existieren.
Zum Beispiel habe ich so etwas:
class Foo
{
public function bar()
{
echo 'foobar';
}
public function override($method_name,$method_args)
{
echo 'Calling method ',$method_name,'<br />';
$this->$method_name($method_args); //dirty, but working
}
}
Und wenn ich das mache:
$foo = new Foo();
$foo->bar();
Ich möchte diese Ausgabe:
Calling method bar
foobar
anstelle von diesem:
foobar
Gibt es eine Möglichkeit, wie das geht?Hilfe bitte :)
Lösung
Nimm dein Original Foo
implementierung könnten Sie ein wickeln decorator
um es herum so:
class Foo
{
public function bar() {
echo 'foobar';
}
}
class Decorator
{
protected $foo;
public function __construct(Foo $foo) {
$this->foo = $foo;
}
public function __call($method_name, $args) {
echo 'Calling method ',$method_name,'<br />';
return call_user_func_array(array($this->foo, $method_name), $args);
}
}
$foo = new Decorator(new Foo());
$foo->bar();
Andere Tipps
Sie können ein Objekt um das Objekt eingeben, indem Sie alle Anrufe abfangen, und dann das Originalobjekt weiterleiten und das Ergebnis zurückzugeben.
Bewahren Sie das Objekt einfach als Variable in Ihrer Wrapper-Klasse auf und verwenden Sie die Überlastungsmethoden in Ihrer Wrapper-Klasse, um das Objekt aufzurufen / einstellen / abzurufen / zu überprüfen.
generasacodicetagpre.Looping Die Wrapper-Klasse in Foreach ist wahrscheinlich schwieriger.Habe das nicht versucht.
Wenn Sie die Funktion auf Privat einstellen, fällt Anruf an, dass der Anruf von außen anruft, wird in __call eingeschlossen, aber Sie können es von innen anrufen
generasacodicetagpre.