Redéfinir les méthodes
Pour réécrire certaines méthodes, afin de modifier leur comportement, il vous suffit de déclarer à nouveau la méthode et d'écrire ce que bon vous semble à l'intérieur.
Par contre, si vous voulez accéder à un attribut de la classe parente pour le modifier, vous ne pourrez pas car notre classe fille n'a pas accès aux attributs de sa classe mère puisqu'ils sont tous privés. Il faut utiliser le mot-clé "parent" suivi du symbole double deux points, suivi lui-même du nom de la méthode à appeler.
<?php
class Magicien extends Personnage {
private $_magie; // Indique la puissance du magicien sur 100, sa capacité à produire de la magie.
public function lancerUnSort($perso) {
$perso->recevoirDegats($this->_magie); // On va dire que la magie du magicien représente sa force.
}
public function gagnerExperience() {
// On appelle la méthode gagnerExperience() de la classe parente
parent::gagnerExperience();
if ($this->_magie < 100) {
$this->_magie += 10;
}
}
}
Type de visibilité : protected
Le type de visibilité protected est en fait une petite modification du type private : il a exactement les mêmes effets que private, à l'exception que toute classe fille aura accès aux éléments protégés. De manière générale, je vous conseille donc de toujours mettre protected au lieu de private
Classe abstraite : Imposer des contraintes
Pour empêcher quiconque d'instancier une classe, il suffit de faire précéder le mot-clé class du mot-clé abstract comme ceci
<?php
// Notre classe Personnage est abstraite
abstract class Personnage {
}
// Création d'une classe Magicien héritant de la classe Personnage.
class Magicien extends Personnage {
}
$magicien = new Magicien; // Tout va bien, la classe Magicien n'est pas abstraite.
$perso = new Personnage; // Erreur fatale car on instancie une classe abstraite.
Classe finale
Le concept des classes et méthodes finales est exactement l'inverse du concept d'abstraction. Si une classe est finale, vous ne pourrez pas créer de classe fille héritant de cette classe. Pour déclarer une classe finale, vous devez placer le mot-clé final juste avant le mot-clé class, comme abstract.