Privaatse omaduste probleem pärimisel OOP-s PHP-s
Asjaolu, et privaatseid omadusi ei pärita, võib viia ootamatu probleemini. Vaatame näidet. Oletame, et meil on järgmine vanemaklass privaatse omadusega:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Oletame, et alamklassis otsustasime luua meetodi, mis suurendab vanust ühe võrra. Kuid proov muuta vanema privaatset omadust viib veani:
<?php
class Student extends User {
public function incAge() {
$this->age++; // viga
}
}
?>
Viga kaob, kui alamklassis
deklareerida privaatne omadus $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Siin ootabki meid lõks! Tegelikult loome kaks privaatset omadust: üks vanemas ja üks järglases. Ja need töötavad täiesti sõltumatult. See tähendab, et vanema meetodid muudavad oma omadust ja järglase meetodid - oma omadust.
Sellel probleemil on tegelikult lahendus. Lihtsalt on vaja manipuleerida vanema privaatseid omadusi läbi selle vanema meetodite. Kirjutame oma koodi ümber vastavalt sellele:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Saab lihtsustada:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Järgmises koodis alamklassis kirjutatakse üle vanema meetod. Parandage probleemid selles koodis:
<?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; // viga
}
}
}
?>