Problém súkromných vlastností pri dedení v OOP v PHP
To, že súkromné vlastnosti nie sú dedené, môže viesť k nečakanému problému. Pozrime sa na príklad. Majme nasledujúcu rodičovskú triedu so súkromnou vlastnosťou:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Povedzme, že v potomkovej triede sme sa rozhodli vytvoriť metódu, ktorá bude zvyšovať vek o jednotku. Avšak, pokus zmeniť súkromnú vlastnosť rodiča povedie k chybe:
<?php
class Student extends User {
public function incAge() {
$this->age++; // chyba
}
}
?>
Chyba zmizne, ak v potomkovej triede
deklarujeme súkromnú vlastnosť $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Tu na nás číha pasca! V skutočnosti sme vytvorili dve súkromné vlastnosti: jednu v rodičovi a jednu v potomkovi. A tieto fungujú úplne nezávisle. To znamená, že metódy rodiča budú meniť svoju vlastnosť a metódy potomka - svoje.
Tento problém má v skutočnosti riešenie. Jednoducho je potrebné manipulovať súkromné vlastnosti rodiča prostredníctvom metód tohto rodiča. Prepíšme náš kód v súlade s týmto:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Môžeme zjednodušiť:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
V nasledujúcom kóde je v potomkovej triede predefinovaná metóda rodiča. Opravte problémy v tomto kóde:
<?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; // chyba
}
}
}
?>