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 :)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top