Masalah Sifat Persendirian dalam Pewarisan OOP dalam PHP
Hakikat bahawa sifat persendirian tidak diwarisi boleh membawa kepada masalah yang tidak dijangka. Mari kita lihat contoh. Katakan kita ada kelas induk berikut dengan sifat persendirian:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Katakan dalam kelas anak kita ingin mencipta metode yang akan menambah usia sebanyak satu. Walau bagaimanapun, percubaan untuk mengubah sifat persendirian induk akan menyebabkan ralat:
<?php
class Student extends User {
public function incAge() {
$this->age++; // ralat
}
}
?>
Ralat akan hilang jika dalam kelas anak
diisytiharkan sifat persendirian $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Di sinilah kita menghadapi perangkap! Sebenarnya, kita telah menghasilkan dua sifat persendirian: satu dalam induk dan satu dalam anak. Dan kedua-duanya berfungsi sepenuhnya secara berasingan. Ini bermakna metode induk akan mengubah sifatnya sendiri, dan metode anak - sifatnya sendiri.
Masalah ini sebenarnya mempunyai penyelesaian. Kita hanya perlu memanipulasi sifat persendirian induk melalui metode induk itu sendiri. Mari kita tulis semula kod kita menurut ini:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Boleh dipermudahkan:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Dalam kod berikut, dalam kelas anak, metode induk diubah suai. Betulkan masalah dalam kod ini:
<?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; // ralat
}
}
}
?>