Tatizo la Sifa za Kibinafsi Wakati wa Kurithi katika OOP katika PHP
Kukosa sifa za kibinafsi kurithiwa, kinaweza kusababisha tatizo lisilotarajiwa. Tuangalie kwa mfano. Tuchukulie tuna kitabu kizazi mzazi chenye sifa ya kibinafsi ifuatayo:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Tuchukulie katika kitabu kizazi mtoto tuliamua kutengeneza njia, ambayo itaongeza umri kwa moja. Hata hivyo, jaribio la /kubadilisha sifa ya kibinafsi ya mzazi litasababisha hitilafu:
<?php
class Student extends User {
public function incAge() {
$this->age++; // hitilafu
}
}
?>
Hitilafu itatoweka, ikiwa katika kitabu kizazi mtoto
kitatangaza sifa ya kibinafsi $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Hapo ndipo tunakabiliwa na mtego! Kweli sisi tulizaa sifa mbili za kibinafsi: moja kwenye mzazi na moja kwenye mtoto. Na zinafanya kazi kikamilifu kwa kujitegemea. Hii inamaanisha, kwamba njia za mzazi zitabadilisha sifa zake, na njia za mtoto - zake.
Tatizo hili kweli lina ufumbuzi. Ni lazima tuwasilishe sifa za kibinafsi za mzazi kupitia njia za mzazi huyo. Tuandike tena msimbo wetu kulingana na hili:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Inaweza kurahisishwa:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Katika msimbo ufuatao kwenye kitabu kizazi mtoto njia ya mzazi inafafanuliwa upya. Sahihisha matatizo kwenye msimbo huu:
<?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; // hitilafu
}
}
}
?>