Problem prywatnych właściwości przy dziedziczeniu w OOP w PHP
To, że prywatne właściwości nie są dziedziczone, może prowadzić do nieoczekiwanego problemu. Spójrzmy na przykład. Załóżmy, że mamy następującą klasę nadrzędną z prywatną właściwością:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Załóżmy, że w klasie potomnej postanowiliśmy stworzyć metodę, która będzie zwiększać wiek o jeden. Jednak próba zmiany prywatnej właściwości rodzica doprowadzi do błędu:
<?php
class Student extends User {
public function incAge() {
$this->age++; // błąd
}
}
?>
Błąd zniknie, jeśli w klasie potomnej
zadeklarujemy prywatną właściwość $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Tutaj właśnie czai się na nas pułapka! W rzeczywistości stworzyliśmy dwie prywatne właściwości: jedną w rodzicu i jedną w potomku. I one działają całkowicie niezależnie. To oznacza, że metody rodzica będą zmieniać swoją właściwość, a metody potomka - swoją.
Ten problem w rzeczywistości ma rozwiązanie. Po prostu trzeba manipulować prywatnymi właściwościami rodzica poprzez metody tego rodzica. Przepiszmy nasz kod zgodnie z tym:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Można uprościć:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
W następującym kodzie w klasie potomnej przesłaniana jest metoda rodzica. Popraw problemy w tym kodzie:
<?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; // błąd
}
}
}
?>