Мушкилотҳои хусусиятҳои хусусӣ дар меросии ООП дар 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; // хато
}
}
}
?>