Vấn đề thuộc tính private trong kế thừa OOP của PHP
Việc các thuộc tính private không được kế thừa có thể dẫn đến một vấn đề bất ngờ. Chúng ta hãy xem xét một ví dụ. Giả sử chúng ta có lớp cha với thuộc tính private như sau:
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Giả sử trong lớp con, chúng ta quyết định tạo một phương thức sẽ tăng tuổi lên một đơn vị. Tuy nhiên, việc cố gắng thay đổi thuộc tính private của lớp cha sẽ dẫn đến lỗi:
<?php
class Student extends User {
public function incAge() {
$this->age++; // lỗi
}
}
?>
Lỗi sẽ biến mất nếu trong lớp con
chúng ta khai báo thuộc tính private $age:
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Đây chính là cái bẫy đang chờ đợi chúng ta! Trên thực tế, chúng ta đã tạo ra hai thuộc tính private: một ở lớp cha và một ở lớp con. Và chúng hoạt động hoàn toàn độc lập với nhau. Điều này có nghĩa là các phương thức của lớp cha sẽ thay đổi thuộc tính của nó, còn các phương thức của lớp con - thuộc tính của chính nó.
Vấn đề này trên thực tế có một giải pháp. Chỉ cần thao tác với thuộc tính private của lớp cha thông qua các phương thức của chính lớp cha đó. Hãy viết lại mã của chúng ta theo cách này:
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Có thể đơn giản hóa:
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Trong mã sau đây, ở lớp con, phương thức của lớp cha bị ghi đè. Hãy sửa các vấn đề trong mã này:
<?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; // lỗi
}
}
}
?>