je cherche à mettre en place une classe gérant les hooks sur les fonctions filles (des classes étendant ma class hook).
Or je me retrouve confronté à un soucis. Comment réussir à déclencher un évènement lors de l'appel d'une fonction ?
J'ai passé un bon moment à parcourir php.net pour trouver solution à mon problème.
Je suis tombé donc sur la fonction magique __call qui permettent de gérer des hooks mais sur des éléments n'existant pas ou ne pouvant être retournés.
J'ai donc une solution temporaire mais qui ne me plaît guère, à savoir tout passer en protected ce qui aura comme conséquence de ne pouvoir être appelé depuis l'extérieur sans déclencher __call.
<?php
class hook
{
private $tab_hook_nom = array('debut' => true, 'fin' => true);
private $tab_hook_fonction = array();
protected $nom_extends = "";
public function __construct($nom)
{
$this->nom_extends = $nom;
}
public function __call($name, $arguments)
{
echo "Appel de la méthode '$name' " . implode(', ', $arguments). "<br />";
if( method_exists($this,$name) )
{
echo "hook debut<br />";
call_user_func_array(array($this->nom_extends, $name), $arguments);
echo "hook fin<br />";
}
}
protected function fonction2($nb1,$nb2,$nb3)
{
echo "fonction2 : $nb1, $nb2, $nb3<br/>";
}
protected function ajouter_hook($nom, $fonction)
{
if( !empty($this->tab_hook_nom[$nom]) )
{
$this->tab_hook_fonction[$nom][$fonction] = $fonction;
return true;
}
else
return false;
}
protected function supprimer_hook($nom, $fonction)
{
if( !empty($this->tab_hook_nom[$nom]) )
{
if( !empty($this->tab_hook_fonction[$nom][$fonction]) )
{
unset($this->tab_hook_fonction[$nom][$fonction]);
}
}
}
}
class test extends hook
{
protected $name = "test";
public function __construct()
{
parent::__construct($this->name);
echo "instanciation<br />";
}
protected function fonction1()
{
echo "fonction1<br />";
}
}
$test = new test();
$test->fonction1(1,2,3);
$test->fonction2();
?>
Déroulement :
J'ai pour le moment toujours le soucis de passer l'array des paramètres à call_user_func_array(), la variable ne semble pas être reconnue comme un type array... Enfin c'est annexe pour le moment, je trouverai bien un moyen.instanciation
Appel de la méthode 'fonction1' 1, 2, 3
hook debut
fonction1
hook fin
Appel de la méthode 'fonction2'
hook debut
Warning: Missing argument 1 for hook::fonction2() in C:\wamp\www\test.php on line 24
Warning: Missing argument 2 for hook::fonction2() in C:\wamp\www\test.php on line 24
Warning: Missing argument 3 for hook::fonction2() in C:\wamp\www\test.php on line 24
Notice: Undefined variable: nb1 in C:\wamp\www\test.php on line 26
Notice: Undefined variable: nb2 in C:\wamp\www\test.php on line 26
Notice: Undefined variable: nb3 in C:\wamp\www\test.php on line 26
fonction2 : , ,
hook fin
Que pensez-vous de cette solution ? Existe-t-il mieux ? Plus propre ?
Bien évidemment il aurait été plus simple de gérer les hooks directement dans les fonctions... Mais c'est une solution que je ne veux pas car je ne peux être sûr que l'utilisateur qui utilisera ma classe pensera à rajouter le code pour les hooks de sa fonction.