Il problema delle proprietà private nell'ereditarietà in OOP in PHP
Il fatto che le proprietà private non vengano ereditate può portare a un problema inaspettato. Diamo un'occhiata a un esempio. Supponiamo di avere la seguente classe genitore con una proprietà privata:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Supponiamo che nella classe figlia abbiamo deciso di creare un metodo che incrementi l'età di uno. Tuttavia, il tentativo di modificare la proprietà privata del genitore porterà a un errore:
<?php
class Student extends User {
public function incAge() {
$this->age++; // errore
}
}
?>
L'errore scomparirà se nella classe figlia
dichiareremo la proprietà privata $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Ed è qui che ci aspetta la trappola! In realtà abbiamo creato due proprietà private: una nel genitore e una nel figlio. E funzionano completamente in modo indipendente. Ciò significa che i metodi del genitore modificheranno la sua proprietà, mentre i metodi del figlio - la propria.
Questo problema in realtà ha una soluzione. Bisogna semplicemente manipolare le proprietà private del genitore tramite i metodi di quel genitore. Riscriviamo il nostro codice in accordo con questo:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Si può semplificare:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Nel codice seguente, nella classe figlia il metodo del genitore viene sovrascritto. Correggi i problemi in questo codice:
<?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; // errore
}
}
}
?>