Wie kann man einen Methodenaufruf für ein Objekt in PHP abfangen?

Lesezeit: 2 Minuten

Benutzer-Avatar
Pirozek

Ich versuche herauszufinden, wie ich jede Methode abfangen kann, die für ein Objekt in PHP aufgerufen wird. Ich kenne die magische Funktion __callwird aber nur für Methoden ausgelöst, die auf dem aufgerufenen Objekt nicht vorhanden sind.

Ich habe zum Beispiel 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

statt dieser hier:

foobar

Gibt es eine Möglichkeit, dies zu tun? Hilfe bitte 🙂

Benutzer-Avatar
Christophe D

Nehmen Sie Ihr Original Foo Implementierung könnten Sie a wickeln decorator drumherum 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();

  • Danke Kollege, genau das habe ich gebraucht 🙂

    – Pirozek

    13. Juli 2010 um 22:32 Uhr

  • Ein Fall, in dem dies nicht funktioniert, ist, wenn Sie Methoden haben, die erwarten Fooz.B someMethod(Foo $foo)

    – Josh Johnson

    11. Februar 2017 um 0:55 Uhr


Benutzer-Avatar
OIS

Sie können ein Objekt um das Objekt wickeln, alle Aufrufe abfangen, sie dann an das ursprüngliche Objekt weiterleiten und das Ergebnis zurückgeben.

Speichern Sie das Objekt einfach als Variable in Ihrer Wrapper-Klasse und verwenden Sie überladende Methoden in Ihrer Wrapper-Klasse, um das Objekt aufzurufen/einzustellen/abzurufen/zu überprüfen.

$object = new AnyObject;
$object = new Wrapper($object);

$object->anyMethod();
$object->anyVar="test";
echo $object->anyVar;
echo $object['array form'];

Das Schleifen der Wrapper-Klasse in foreach ist wahrscheinlich schwieriger. Habe das nicht probiert.

  • Kannst du bitte genauer werden? Nur ein kleines Beispiel 🙂

    – Pirozek

    13. Juli 2010 um 22:21 Uhr

Wenn Sie die Funktion auf private setzen, wird call jeden Anruf von außen abfangen, der in __call abgefangen wird, aber Sie können ihn von innen aufrufen

class Foo
{
   private function bar()
   {
      echo 'foobar';
   }

   public function __call($method_name,$method_args)
   {
      echo 'Calling method ',$method_name,'<br />';
      $this->$method_name(); //dirty, but working
   }
}

1187470cookie-checkWie kann man einen Methodenaufruf für ein Objekt in PHP abfangen?

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

Privacy policy