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; // қате
}
}
}
?>