АКЦЫЯ: бясплатныя месячныя курсы па стварэнні сайтаў
на выбар: вёрстка, JavaScript, PHP, Python або фрэймворкі. Сёння апошні дзень для запісу! Націскай!
⊗ppOpIhPPP 33 of 107 menu

Праблема прыватных уласцівасцяў пры наследаванні ў ААП у 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; // памылка } } } ?>
byenru