Je voudrais faire de l’héritage dynamique en PHP : j’ai une classe de base que je veux instancier et ensuite je veux redéfinir une de ses opérations. Je ne peux pas faire d’héritage statique simple car le contenu de l’opération que je veux redéfinir dépend de l’exécution. Est-ce que c’est possible avec PHP 5.1 ?
Au final je dois pouvoir écrire un code de ce genre :
$objet = MaClasseDeBase();
$objet->operationARedefinir = ...
$objet->operationARedefinir();
Pour info, c’est une opération qui ne fait que renvoyer une array.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Spipu Le 12/02/2010 à 09:03 jamais fait, et je trouve va pas très propre...
je te conseillerais plutot de prévoir des sous méthodes privées pour ton opération principale, et de lui passer en paramètre le nom du traitement que tu veux qu'elle fasse.
$objet->operationARedefinir('traitement_1');
Zeph Le 12/02/2010 à 10:07 C'est pas forcément évident à faire en PHP, parceque les fonctions sont gérées d'une façon bien particulière. Il y a bien une façon pour appeler une fonction à partir de son nom (donc d'une chaine), mais ça ne marchera pas si le nom est un attribut de ta classe puisque la syntaxe pour accéder à un attribut ($o->attribute) est la même que pour une méthode ($o->method(...)) :/
Du coup je ne vois pas trop comment faire sans passer par deux méthodes, un peu dans ce style :
<?php
function attached ($this)
{
echo 'OK';
}
class A
{
public $method;
public function callback ()
{
call_user_func ($this->method, $this);
}
}
$a = new A ();
$a->method = 'attached';
$a->callback ();
?>
C'est applicable aussi si "attached" doit être une autre méthode de "A" et non une fonction externe, mais mais c'est quand même hyper laid ^^
(en revanche je ne suis pas d'accord avec Spipu, il a des situations où ça peut être une bonne solution, c'est juste la faiblesse du PHP qui rend ça périlleux)

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
en php 5 y'a il me semble une fonction magique __call qui est appelée si une méthode de classe n'est pas définie.
Spipu Le 13/02/2010 à 01:15 perso, pour PHP, je code soi sous PHP-eclipse, soit directement sous VIM, suivant sur quelle machine je code
et comme framework PHP, j'utilise pour le boulot Symfony, et pour le perso mon propre framework