Kế thừa lớp trong lập trình hướng đối tượng với PHP

Ở các phần trước, các bạn đã biết đến khái niệm kế thừa giữa các lớp, đó là khả năng một lớp có thể được kế thừa các thành phần dữ liệu cũng như phương thức của một lớp nào đó. Lớp thừa kế những phương thức và thuộc tính của lớp khác được gọi là lớp con, còn lớp được kế thừa được gọi là lớp cha.

Trong ngôn ngữ lập trình PHP, một lớp có thể thừa kế các phương thức cũng như các thuộc tính của một lớp khác bằng cách sử dụng từ khoá extends trong khi khai báo tên lớp.

Ví dụ dưới đây thực hiện việc mở rộng lớp hoso ở trên thêm một số thuộc tính mới bằng cách kế thừa từ lớp ho-so:

<HTML>
<HEAD>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
</HEAD>
<BODY>
<?
class ho-so
{
public $ho_ten = “Nguyễn Huy Hoàng”;
public $ngay_sinh = “13/04/1992″;
public function lap_gia_tri($hoten,$ngaysinh)
{
$this->ho_ten = $hoten;
$this->ngay_sinh=$ngaysinh;
}
}
class hoso2 extends ho-so
{
public $noi_sinh=”Hà nội”;
public function in_hoso()
{
echo “Họ tên: ” . $this->ho_ten . “. Ngày sinh: ” . $this->ngay_sinh . ” . Nơi sinh: ” . $this->noi_sinh;
}
}
$hoang=new hoso2;
$hoang->in_hoso();
?>
</BODY>
</HTML>


Các phương thức và thành viên thừa kế từ lớp cha sang lớp con có thể bị ghi đè nếu như lớp cha không định nghĩa chúng dưới dạng các phương thức cuối cùng với từ khoá final.

Kỹ thuật ghi đè cho phép chúng ta có thể định nghĩa lại các hàm trong lớp cha bằng các hàm cùng tên trong lớp con nhưng hai hàm này có hai chức năng hoàn toàn khác nhau. Nhiều người gọi kỹ thuật này là “đa hình” do chúng tạo ra nhiều hình thái khác nhau ở các lớp thừa kế.

Chúng ta có thể truy cập đến các phương thức hay thành viên đã bị ghi đè bằng cách tham chiếu chúng với từ khoá parent và toán tử tham chiếu ::, tiếp theo là phương thức hay thành viên cần tham chiếu (parent::ten_phuong_thuc).

Ví dụ dưới đây mô tả cách thức ghi đè:

<HEAD>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
</HEAD>
<BODY>
<?
class hoso
{
public $ho_ten = “Nguyễn Huy Hoàng”;
public $ngay_sinh = “13/04/1992”;
public function in_hoso()
{
echo “Họ tên:” . $this->ho_ten . “. Ngày sinh: ” . $this->ngay_sinh;
}
}
class hoso2 extends hoso
{
public $noi_sinh=”Hà Nội”;
public function in_hoso()
{
parent::in_hoso();
echo “. Nơi sinh: ” . $this->noi_sinh;
}
}
$hoang=new hoso2;
$hoang->in_hoso();
?>
</BODY>
</HTML>


Như các bạn đã thấy, đối tượng $hoang thuộc lớp hoso2 đã được kế thừa mọi thứ ở lớp hoso. Trong lớp hoso2, chúng ta đã định nghĩa một hàm trùng tên với một hàm đã có sẵn trong lớp hoso (hàm in_hoso()). Hàm in_hoso() của lớp hoso2 đã ghi đè lên hàm in_hoso() của lớp hoso, nhưng trong bản thân nó lại có thể triệu gọi trực tiếp đến hàm in_hoso() trong lớp cha (hoso).
Chúc bạn thành công.

FOLLOW US

Leave a Reply

Your email address will not be published. Required fields are marked *