Page 1 sur 1

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

Posté : 13 juin 2007, 09:38
par wulfy
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 :)

Posté : 13 juin 2007, 10:14
par zigz4g
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.

Posté : 13 juin 2007, 11:46
par naholyr
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 !

Posté : 13 juin 2007, 14:09
par wulfy
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" :)