Dans un précédent billet, je parlais de mes malheurs avec PHP lorsqu'il était question de manipuler des interfaces couplées avec des classes abstraites.
Voici que Julien, alors qu'il travaille sur validateurs (une nouveauté de Copix 3.1), viens de trouver la bonne façon de procéder pour marier nos amoureux.
Ce qu'il ne faut pas faire (1)
interface IClasse {
public function show ();
}
abstract class AClasse {
abstract public function show ();
}
class AClasseConcrete extends AClasse implements IClass {
public function show (){
echo "Everything is ok";
}
}
$classe = new AClasseConcrete ();
$classe->show ();
Donne le message d'erreur
Fatal error: Can't inherit abstract function IClasse::show() (previously declared abstract in AClasse) in
/home/geraldc/workspace/Copix_3/www/syntax_playground.php
Ce qu'il ne faut pas faire (2)
interface IClasse {
public function show ();
}
abstract class AClasse implements IClasse {
abstract public function show ();
}
class AClasseConcrete extends AClasse {
public function show (){
echo "Everything is ok";
}
}
$classe = new AClasseConcrete ();
$classe->show ();
Donne le message d'erreur
Fatal error: Can't inherit abstract function IClasse::show() (previously declared abstract in AClasse) in
in /home/geraldc/workspace/Copix_3/www/syntax_playground.php
Ce qu'il faut faire (enfin !)
interface IClasse {
public function show ();
}
abstract class AClasse implements IClasse {
//Ne PAS déclarer la méthode show de l'interface, même abstraite
}
class AClasseConcrete extends AClasse {
public function show (){
echo "Everything is ok";
}
}
$classe = new AClasseConcrete ();
$classe->show ();
Et la, tout fonctionne !
Ne pas ajouter la définition de l'ensemble des méthodes de l'interface..... il fallait y penser :-)
Bon, il va falloir que je refasse un tour dans les sources de Copix pour remédier aux workaround que j'employais jusqu'alors.
Derniers commentaires