Le problème des propriétés privées lors de l'héritage en POO en PHP
Le fait que les propriétés privées ne soient pas héritées peut mener à un problème inattendu. Regardons un exemple. Supposons que nous ayons la classe parente suivante avec une propriété privée :
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Supposons que dans la classe enfant nous ayons décidé de créer une méthode qui augmentera l'âge de un an. Cependant, la tentative de modifier la propriété privée du parent entraînera une erreur :
<?php
class Student extends User {
public function incAge() {
$this->age++; // erreur
}
}
?>
L'erreur disparaîtra si dans la classe enfant
on déclare la propriété privée $age :
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
C'est là que le piège nous attend ! En réalité, nous avons créé deux propriétés privées : une dans le parent et une dans l'enfant. Et elles fonctionnent complètement indépendamment. Cela signifie que les méthodes du parent modifieront leur propriété, et les méthodes de l'enfant - les leurs.
Ce problème a en réalité une solution. Il suffit de manipuler les propriétés privées du parent via les méthodes de ce parent. Réécrivons notre code en conséquence :
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
On peut simplifier :
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Dans le code suivant, dans la classe enfant, la méthode du parent est redéfinie. Corrigez les problèmes dans ce code :
<?php
class User {
private $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
class Employee extends User {
public function setName($name) {
if (strlen($name) > 0) {
$this->name = $name; // erreur
}
}
}
?>