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; // хатолик
}
}
}
?>