Problem privatnih svojstava pri nasleđivanju u OOP-u u PHP-u
To što se privatna svojstva ne nasleđuju, može dovesti do neočekivanog problema. Pogledajmo na primeru. Neka imamo sledeći roditeljski klasa sa privatnim svojstvom:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Neka smo u klasi-potomku odlučili da napravimo metod, koji će povećavati godine za jedan. Međutim, pokušaj izmene privatnog svojstva roditelja dovesti će do greške:
<?php
class Student extends User {
public function incAge() {
$this->age++; // greška
}
}
?>
Greška će nestati ako u klasi-potomku
deklarišemo privatno svojstvo $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Tu nas čeka zamka! U stvari, stvorili smo dva privatna svojstva: jedno u roditelju i jedno u potomku. I ona rade potpuno nezavisno. To znači da će metodi roditelja menjati svoje svojstvo, a metodi potomka - svoje.
Ovaj problem zapravo ima rešenje. Jednostavno treba manipulisati privatnim svojstvima roditelja preko metoda tog roditelja. Prepišimo naš kod u skladu sa tim:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Može se pojednostaviti:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
U sledećem kodu u klasi potomku je redefinisan metod roditelja. Ispravite probleme u ovom kodu:
<?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; // greška
}
}
}
?>