abstract class EtreVivant { protected $_age; protected $_poids; public function getAge() { echo "J'ai " . $this->_age . " ans", PHP_EOL; } public function getPoids() { echo "Je pèse " . $this->_poids . " grammes", PHP_EOL; } public function __construct($age = 0, $poids = 0) { $this->_age = $age; $this->_poids = $poids; } // rajoutez les setters... } interface Respiration { public function respirer(); } interface Reproduction { public function seReproduire(); } abstract class Vegetal extends EtreVivant implements Respiration, Reproduction { protected $_chlorophyllien = false; public function respirer() { echo "Je fais ma photo-synthèse", PHP_EOL; } public function estChlorophyllien() { return (true == $this->_chlorophyllien); } } class Lys extends Vegetal { public function seReproduire() { echo "Le vent et les insectes font le travail", PHP_EOL; } public function __construct($age = 0, $poids = 0) { $this->_chlorophyllien = true; parent::__construct($age, $poids); } } $lys = new Lys; $lys->seReproduire(); $lys->respirer(); $lys->getPoids(); $lys->getAge(); echo ("Je suis ") . (!$lys->estChlorophyllien() ? 'pas ' : '') . "chlorophyllien", PHP_EOL;
Pour résumer :
- les classes abstraites ne s’instancient pas, on en hérite donc forcément !
- ce sont des débuts d’implémentation, elles peuvent comporter des méthodes entièrement ou partiellement écrites
- une classe abstraite n’a pas forcément de méthode abstraite…
- …mais une classe qui a une méthode abstraite doit être abstraite
- une méthode abstraite n’a pas de corps, c’est un prototype : à vous de la concrétiser !
- une classe abstraite n’est pas tenue de concrétiser les méthodes des interfaces qu’elle implémente; ses filles oui, par contre !
- mettre une méthode abstraite en mode d’accès privé n’a pas de sens
- une classe abstraite peut très bien avoir des variables d’instance
PS : j’ai remarqué que certains élèves étaient choqués de voir un constructeur dans une classe abstraite (« Pourquoi y a-t-il un constructeur si on ne peut PAS les instancier ??? »). Ce constructeur a tout à fait sa place, il peut être utilisé dans les classes filles ou bien être complété dans celles-ci par des actions spécifiques (et invoqué via l’appel statique parent, comme fait ici).