4 votes

Comment puis-je créer une méthode qui est appelée chaque fois qu'une méthode publique est appelée ?

Comment puis-je créer une méthode qui est appelée chaque fois qu'une méthode publique est appelée ? On pourrait aussi dire qu'il s'agit d'un post-méthode-call-hook.

Mon code actuel :

<?php
class Name {
   public function foo() {
      echo "Foo called\n";
   }

   public function bar() {
      echo "Bar called\n";
   }

   protected function baz() {
      echo "Baz called\n";
   }
}

$name = new Name();
$name->foo();
$name->bar();

La sortie actuelle dans ce code serait :

Foo called
Bar called

Je voudrais que la méthode baz() soit appelée chaque fois qu'une autre méthode publique est appelée. Par exemple

Baz called
Foo called
Baz called
Bar called

Je sais que j'aurais pu faire quelque chose comme ça :

public function foo() {
    $this->baz();
    echo "Foo called\n";
}

Mais cela ne résoudrait pas vraiment mon problème car ce n'est pas vraiment orthogonal et c'est relativement pénible à mettre en œuvre si j'ai 100 méthodes qui ont besoin que cette autre méthode soit appelée avant elles.

2voto

quickshiftin Points 6379

Ce n'est peut-être pas ce que vous attendez ou voulez exactement, mais en utilisant la méthode magique __call et en marquant ces méthodes publiques protected ou private vous pouvez obtenir l'effet désiré :

<?php
class Name {
    public function __call($method, $params) {
        if(!in_array($method, array('foo', 'bar')))
            return;
        $this->baz();
        return call_user_func_array(
                    array($this, $method), $params);
    }

   protected function foo() {
      echo "Foo called\n";
   }

   protected function bar() {
      echo "Bar called\n";
   }

   protected function baz() {
      echo "Baz called\n";
   }
}

$name = new Name();
$name->foo();
$name->bar();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X