Trong bài này, chúng ta sẽ tìm hiểu về tính kế thừa (inheritance) trong PHP. Để học tốt bài này, các bạn cần đọc lại bài Cài đặt môi trường lập trình Web PHP với XAMPP để biết cách chạy ứng dụng web PHP với XAMPP.
1. Kế thừa (inheritance) trong PHP là gì?
Tính kế thừa (inheritance) đề cập đến việc định nghĩa một lớp mới (new class) dựa trên một lớp cũ đã có (existing class). Lớp mới được gọi là lớp dẫn xuất (derived class) hay lớp con (child class). Lớp cũ đã có gọi là lớp cơ sở (base class) hoặc lớp cha (parent class).
Lớp con sẽ kế thừa tất cả các thuộc tính và phương thức public và protected từ lớp cha. Ngoài ra, lớp con có thể có các thuộc tính và phương thức riêng.
Trong PHP, một lớp con kế thừa lớp cha bằng cách sử dụng từ khóa extends. Ví dụ:
<?php
class Cat {
public $name;
public $color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function info() {
echo "The cat is {$this->name} and the color is {$this->color}.";
}
}
class Kitty extends Cat {
public function message() {
echo "Hello, my name is " . $this->name . ", has " . $this->color . " color";
}
}
$kitty = new Kitty("Kitty", "pink and white");
$kitty->message();
echo "<br>";
$kitty->info();
?>
Lớp Kitty kế thừa từ lớp Cat. Lớp Kitty có thể sử dụng các thuộc tính public $name và $color cũng như các phương thức public __construct()
và info()
kế thừa từ lớp Cat. Lớp Kitty cũng có phương thức của riêng nó là message()
.
2. Chỉ định truy cập protected trong kế thừa
Những thuộc tính và phương thức có chỉ định truy cập là protected thì chỉ được truy cập bên trong lớp (class) chứa nó và lớp dẫn xuất (derived class) của lớp đó.
<?php
class Cat {
public $name;
public $color;
protected $weight;
public function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
protected function info() {
echo "The cat is {$this->name} and the color is {$this->color}.";
}
}
class Kitty extends Cat {
public function message() {
// using protected method
$this->info();
echo "<br>Hello, my name is " . $this->name . ", has " . $this->color . " color";
// using protected $weight in derived class
echo "<br> And my weight is " . $this->weight . " kilograms";
}
}
$kitty = new Kitty("Kitty", "pink and white", "3.5");
$kitty->message();
?>
Trong ví dụ trên, thuộc tính $weight có chỉ định truy cập là protected và có thể sử dụng trong lớp dẫn xuất. Phương thức info()
có chỉ định truy cập là protected và có thể sử dụng trong lớp dẫn xuất.
3. Ghi đè (overriding) phương thức kế thừa trong PHP
Các phương thức mà lớp con kế thừa có thể được ghi đè (overriding) bằng cách định nghĩa lại các phương thức này trong lớp con.
<?php
class Cat {
public $name;
public $color;
public function __construct($name, $color) {
$this->name = $name;
$this->color = $color;
}
public function info() {
echo "The cat is {$this->name} and the color is {$this->color}.";
}
}
class Kitty extends Cat {
public $weight;
public function __construct($name, $color, $weight) {
$this->name = $name;
$this->color = $color;
$this->weight = $weight;
}
public function info() {
echo "Hello, my name is " . $this->name . ", has " . $this->color . " color";
// using protected $weight in derived class
echo "<br> And my weight is " . $this->weight . " kilograms";
}
}
$kitty = new Kitty("Kitty", "pink and white", "3.5");
$kitty->info();
?>
Kết quả
Hello, my name is Kitty, has pink and white color
And my weight is 3.5 kilograms
Các phương thức __construct()
và info()
trong lớp con Kitty sẽ ghi đè các phương thức __construct()
và info()
trong lớp cha Cat.
4. Từ khóa final và kế thừa trong PHP
Từ khóa final có thể được sử dụng để ngăn kế thừa một lớp hoặc ngăn ghi đè (overriding) phương thức.
<?php
final class Cat {
//code
}
// will result in error
class Kitty extends Cat {
//code
}
?>
Trong ví dụ trên, lớp Cat được khai báo final nên không được kế thừa.
<?php
class Cat {
final public function info() {
// some code
}
}
class Kitty extends Cat {
// will result in error
public function info() {
// some code
}
}
?>
Trong ví dụ trên, hàm info()
trong lớp Cat được khai báo final nên không được ghi đè trong lớp con Kitty.