Fonction s'exécutant avant chaque appel à une fonction

wulfy
Invité n'ayant pas de compte PHPfrance

13 juin 2007, 09:38

Bonjour,

j'aurai besoin d'une fonction permettant de catcher tous les appels à des fonctions membre d'une classe.
Elle me permettrai de faire des opérations avant chaque appel à une fonction (un peu comme la gestion des erreurs).

Il me semble avoir croisé sur internet une fonction de ce genre mais pas moyen de remettre la main dessus.
Si mes souvenirs sont bons les paramètres d'entrée étaient le nom de la fonction et ses paramètres (sous forme de tableau).


Si quelcun a une idée , merci beaucoup :)

Mammouth du PHP | 684 Messages

13 juin 2007, 10:14

function catchAll($funct, $param = null)
{
    switch ($funct) {
        case 'myFunct' :
              if (count($param) == 2)
                   myFunct($param[0], $param[1]);
              break;
         //etc...
    }
}
Moi j'appel cela un aiguilleur mais bon c'est plus un terme de mon choix.
Si ca peut t'aider.
Pour ta fonction sur le net, je dirais regarde peut etre du cote de eval() dans la doc, pour commencer.
Zigz4g

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

13 juin 2007, 11:46

Il y a une méthode magique __call en PHP5.

Mettons que tu aies une classe avec une série de méthodes publiques que tu veuilles "intercepter", le moyen le plus sûr et efficace c'est de les renommer, les passer en private, et ne pouvoir les appeler que via __call.
class MaClasse {
  public function maMethode($arg) {
    // ... code de ma méthode
  }
}
Devient
class MaClasse {
  private function ___maMethode($arg) {
    // ... code de ma méthode
  }
  public function __call($func, $args) { // wrapper pour les fonctions "___*"
    if (method_exists($this, "___$func")) {
      // ... code à effectuer avant chaque appel de méthode
      return call_user_func_array(array($this,"___$func"), $args);
  }
}
Exemple
class Afficheur {

  private function ___affiche($texte) {
    echo $arg;
  }

  public function __call($func, $args) { // wrapper pour les fonctions "___*"
    if (method_exists($this, "___$func")) {
      echo "$func interceptée... ";
      return call_user_func_array(array($this,"___$func"), $args);
    }
  }

}

$afficheur = new Afficheur;
$afficheur->affiche("Coucou !");
affiche interceptée... Coucou !

wulfy
Invité n'ayant pas de compte PHPfrance

13 juin 2007, 14:09

merci pour les réponses !

Alors au sujet du __call j'ai pensé à utiliser cette fonction mais le problème est que le code que j'aimerai évoluer a été fait par une autre personne et concerne plusieurs fichiers (soit une centaine de fonction).
Donc avant de m'atteler à tout passer en "private" je voulais savoir si une fonction pouvait catcher les appels même si la fonction existe .

Pour l'aiguilleur (il est vrai que le terme est plus précis que le mien ;) ) le problème reste le même (voir pire) car je dois installer cette fonctionnalité sans avoir à refaire tous les appels de fonction du projet :!:

Mais si la fonction équivalente à __call en version "même si la fonction existe" est impossible à faire je me rabattrai sur la méthode qui consiste à passer les déclarations en "private" :)