Masalah Properti Privat dalam Pewarisan OOP di PHP
Fakta bahwa properti privat tidak diwariskan dapat menyebabkan masalah yang tidak terduga. Mari kita lihat sebuah contoh. Misalkan kita memiliki kelas induk berikut dengan properti privat:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Misalkan dalam kelas turunan kita memutuskan untuk membuat metode yang akan menambah usia sebanyak satu. Namun, upaya untuk mengubah properti privat induk akan menyebabkan kesalahan:
<?php
class Student extends User {
public function incAge() {
$this->age++; // kesalahan
}
}
?>
Kesalahan akan hilang jika dalam kelas turunan
dideklarasikan properti privat $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Di sinilah jebakan mengintai kita! Sebenarnya, kita menghasilkan dua properti privat: satu di induk dan satu di turunan. Dan keduanya bekerja sepenuhnya independen. Ini berarti bahwa metode induk akan mengubah propertinya sendiri, dan metode turunan - miliknya sendiri.
Masalah ini sebenarnya memiliki solusi. Hanya perlu memanipulasi properti privat induk melalui metode induk itu sendiri. Mari kita tulis ulang kode kita sesuai dengan ini:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Dapat disederhanakan:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Dalam kode berikut, di kelas turunan metode induk ditimpa. Perbaiki masalah dalam kode 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; // kesalahan
}
}
}
?>