Giới thiệu
Kế thừa là nguyên lý quan trọng của phương pháp lập trình hướng đối tượng. Sử dụng nguyên lý này, mối quan hệ giữa hai lớp có thể được định nghĩa. PHP hỗ trợ kế thừa trong mô hình đối tượng của nó.
PHP sử dụng từ khóa extends để thiết lập mối quan hệ giữa hai lớp.
Cú pháp
class B extends A
trong đó A là lớp cơ sở (base class / parent class) và B là lớp con (subclass / child class). Lớp con kế thừa các phương thức public và protected của lớp cha. Lớp con có thể định nghĩa lại (override) bất kỳ phương thức kế thừa nào. Nếu không, các phương thức kế thừa sẽ giữ nguyên chức năng như được định nghĩa trong lớp cha khi dùng với đối tượng của lớp con.
Định nghĩa của lớp cha phải đứng trước định nghĩa lớp con. Trong trường hợp này, định nghĩa lớp A nên xuất hiện trước định nghĩa lớp B trong script.
Ví dụ cơ bản
<?php
class A {
// thuộc tính, hằng số và phương thức của lớp A
}
class B extends A {
// phương thức public và protected được kế thừa
}
?>
Nếu autoloading được bật, định nghĩa lớp cha sẽ được lấy bằng cách tải script lớp.
Ví dụ kế thừa: Kế thừa public và protected
<?php
class parentclass {
public function publicmethod() {
echo "This is public method of parent class\n";
}
protected function protectedmethod() {
echo "This is protected method of parent class\n";
}
private function privatemethod() {
echo "This is private method of parent class\n";
}
}
class childclass extends parentclass {
public function childmethod() {
$this->protectedmethod();
//$this->privatemethod(); // này sẽ gây lỗi
}
}
$obj = new childclass();
$obj->publicmethod();
$obj->childmethod();
?>
Kết quả
This is public method of parent class This is protected method of parent class PHP Fatal error: Uncaught Error: Call to private method parentclass::privatemethod() from context 'childclass'
Ví dụ ghi đè phương thức (Method Overriding)
Nếu phương thức kế thừa từ lớp cha được định nghĩa lại trong lớp con, định nghĩa mới sẽ ghi đè chức năng cũ.
<?php
class parentclass {
public function publicmethod() {
echo "This is public method of parent class\n";
}
protected function protectedmethod() {
echo "This is protected method of parent class\n";
}
private function privatemethod() {
echo "This is private method of parent class\n";
}
}
class childclass extends parentclass {
public function publicmethod() {
echo "public method of parent class is overridden in child class\n";
}
}
$obj = new childclass();
$obj->publicmethod();
?>
Kết quả
public method of parent class is overridden in child class
Kế thừa phân cấp (Hierarchical Inheritance)
PHP không hỗ trợ đa kế thừa (multiple inheritance). Một class không thể extends hai hay nhiều class. Tuy nhiên, PHP hỗ trợ kế thừa phân cấp:
<?php
class A {
function test() {
echo "method in A class";
}
}
class B extends A {
//
}
class C extends B {
//
}
$obj = new C();
$obj->test();
?>
Kết quả
method in A class