Праблема прыватных уласцівасцяў пры наследаванні ў ААП у PHP
Тое, што прыватныя ўласцівасці не наследуюцца, можа прывесці да нечаканай праблемы. Давайце паглядзім на прыкладзе. Хай у нас ёсць наступны клас-бацька з прыватным уласцівасцю:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Хай у класе-нашчадку мы вырашылі зрабіць метад, які будзе павялічваць ўзрост на адзінку. Аднак, спроба змяніць прыватнае ўласцівасць бацькі прывядзе да памылкі:
<?php
class Student extends User {
public function incAge() {
$this->age++; // памылка
}
}
?>
Памылка знікне, калі ў класе-нашчадку
аб'явіць прыватнае ўласцівасць $age
:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Вось-вось нас і падпільноўвае пастка! На самай справе мы зрабілі два прыватныя ўласцівасці: адно ў бацьку і адно ў нашчадку. І яны працуюць цалкам незалежна. Гэта значыць, што метады бацькі будуць змяняць свой уласцівасць, а метады нашчадка - свае.
Гэтая праблема на самай справе мае рашэнне. Проста трэба маніпуляваць прыватнымі ўласцівасцямі бацькі праз метады гэтага бацькі. Давайце перапішам наш код у адпаведнасці з гэтым:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Можна спрасціць:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
У наступным кодзе ў класе нашчадка пераазначаецца метад бацькі. Выпраўце праблемы ў гэтым кодзе:
<?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; // памылка
}
}
}
?>