Težava z zasebnimi lastnostmi pri dedovanju v OOP v PHP
Dejstvo, da se zasebne lastnosti ne dedujejo, lahko povzroči nepričakovano težavo. Poglejmo si primer. Recimo, da imamo naslednji starševski razred z zasebno lastnostjo:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Recimo, da smo v podrejenem razredu želeli narediti metodo, ki bo povečala starost za ena. Vendar poskus spreminjanja zasebne lastnosti starša bo povzročil napako:
<?php
class Student extends User {
public function incAge() {
$this->age++; // napaka
}
}
?>
Napaka bo izginila, če v podrejenem razredu
deklariramo zasebno lastnost $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Tu nas čaka past! Pravzaprav smo ustvarili dve zasebni lastnosti: eno v staršu in eno v potomcu. In delujeta povsem neodvisno. To pomeni, da bodo metode starša spreminjale svojo lastnost, metode potomca pa svojo.
Ta težava ima pravzaprav rešitev. Preprosto je treba upravljati z zasebnimi lastnostmi starša prek metod tega starša. Prepišimo našo kodo v skladu s tem:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Lahko poenostavimo:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
V naslednji kodi se v podrejenem razredu prepiše metoda starša. Popravite težave v tej kodi:
<?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; // napaka
}
}
}
?>