Aussi moche soit-il, PHP s'est imposé chez bon nombre d'hébergeurs, et souvent, "il faut faire avec".
L'astuce du jour : comment définir une classe héritant dynamiquement d'une autre classe ?
Forcément, le code suivant ne fonctionne pas :
<?php
$classToInherit = "parentClass";
class parentClass {
public function hello() {
echo "Hello, world !";
}
}
class childClass extends $classToInherit {
public function hello() {
parent::hello();
echo "Hello, too!";
}
}
$o = new childClass();
$o->hello();
?>
Ce serait trop simple...
Qu'à cela ne tienne, il existe une fonction qui va nous permettre de ruser, la fonction class_alias. Et voilà le travail :
<?php
$classToInherit = "parentClass";
class parentClass {
public function hello() {
echo "Hello, world !";
}
}
class_alias($classToInherit,"myCustomClass");
class childClass extends myCustomClass {
public function hello() {
parent::hello();
echo "Hello, too!";
}
}
$o = new childClass();
$o->hello();
?>
(J'entends déjà les "dans les vrais langages, on peut faire ça proprement", et je suis entièrement d'accord :)

3 réactions
1 De biou - 30/08/2010, 14:47
je ne connaissais pas... Est-ce que tu aurais un exemple d'un cas dans lequel c'est utile ? j'en ai encore jamais eu besoin perso.
2 De Dsls - 30/08/2010, 14:51
Le cas s'est produit pour un plugin dc2, voulant surcharger la classe définie par DC_AUTH_CLASS, sans pour autant la remplacer (ex : faire une authentification coté public du blog, en enlevant quelques tests).
3 De Nicolas - 07/09/2010, 23:38
Excellent. Je cherchais un moyen de surcharger une classe d'un autre plugin. Voilà la solution (pas encore testé).
p.s: as-tu reçu mon mail ? Si non peux-tu me contacter ? Je collabore à la création d'un package debian pour dotclear et j'aurais des questions.