Kế thừa class trong PHP

Trong bài này chúng ta đã tìm hiểu khái niệm tính kế thừa trong lập trình hướng đối tượng và các cách kế thừa trong php.

Như chúng ta đã biết thì Hướng Đối Tượng có 4 tính chất đặc trưng đó là: kế thừa, đóng gói, trừu tượng, đa hình. Và sau đây chúng ta sẽ cùng đi vào tìm hiểu tính kế thừa trong PHP OOP.

1. Tính kế thừa trong Hướng Đối Tượng và PHP

Kế thừa là gì?

- Để cho dễ hiểu thì chúng ta cùng tìm hiểu ví dụ sau đây:

Đầu tiên chúng ta sẽ tạo 2 class cùng các thuộc tính và phương thức như sau:

Class Con người

class ConNguoi
{
    // Thuộc Tính
    var $tai         = '';
    var $mat       = '';
    var $mui       = '';
    var $mieng   = '';
    var $chan     = '';
    var $tay        = '';
    var $gioitinh  = '';
  
    // Hàm, phương thức
    function di(){
        // lệnh
    }
  
    function dung(){
        // lệnh
    }
  
    function an(){
        // lệnh
    }

    function uong(){
        // lệnh
    }
      function ngu(){
        // lệnh
    }
    
    function nghi(){
        // lệnh
    }
}

Class Trẻ con

class TreCon
{
    // Thuộc Tính
    var $tai         = '';
    var $mat       = '';
    var $mui       = '';
    var $mieng   = '';
    var $chan     = '';
    var $tay        = '';
    var $gioitinh  = '';
  
    // Hàm, phương thức
    function bo(){
        // lệnh
    }
    function lay(){
        // lệnh
    }
    function di(){
        // lệnh
    }
  
    function dung(){
        // lệnh
    }
  
    function an(){
        // lệnh
    }

    function uong(){
        // lệnh
    }
      function ngu(){
        // lệnh
    }
    
    function nghi(){
        // lệnh
    }
}

- Theo như chúng ta đã thấy 2 Class ConNguoi và Class TreCon có những thuộc tính và phương thức giống nhau nhưng tại sao lại phải viết đi viết lại 2 lần như vậy. Để giải quyết vấn đề đó lập trình Hướng Đối Tượng sinh ra 1 tính chất gọi là tính Kế thừa. 

- Trong PHP để khai báo kế thừa từ lớp cha sang lớp con ta sử dụng từ khoá extends theo cú pháp:

class con extends class cha
{
    //code;
}

 Vậy ví dụ trên sẽ được viết lại như sau:

// Lớp Cha
class ConNguoi
{
    // Thuộc Tính
    var $tai        = '';
    var $mat      = '';
    var $mui      = '';
    var $mieng  = '';
    var $chan    = '';
    var $tay       = '';
    var $gioitinh = '';
  
    // Hàm, phương thức
    function di(){
        // lệnh
    }
  
    function dung(){
        // lệnh
    }
  
    function an(){
        // lệnh
    }
  
    function uong(){
        // lệnh
    }
    function ngu(){
        // lệnh
    }
    function nghi(){
        // lệnh
    }
}
  
// Lớp Con
class TreCon extends ConNguoi {
  
    // Tất cả các thuộc tính khác đều kế thừa từ cha
    // nên không cần viết lại
    // chỉ riêng thuộc tính nào class cha không có mà class con có chúng ta sẽ khai báo

    function bo(){
        // lệnh
    }
    function lay(){
        // lệnh
    }  
}

2. Cách gọi cách thuộc tính và phương thức của class cha

- Sau khi kế thừa thì lớp con sẽ có tất cả những thuộc tính và phương thức của lớp cha, vậy làm như thế nào để truy xuất đến những thuộc tính và phương thức đó?

Có 2 cách gọi đó là gọi từ bên trong gọi từ bên ngoài

+ Gọi từ bên trong: như khái niệm tính kế thừa, lớp con kế thừa từ lớp cha nên tất cả các thuộc tính và phương thức của lớp cha coi như là của lớp con nên cách gọi cũng tương tự như cách gọi chính thuộc tính và phương thức của nó, đó chính là dùng từ khoá $this->thuoctinh$this->phuong_thuc().

Tuy nhiên để phân biệt hàm nào của lớp cha, hàm nào của lớp con người ta hay dùng từ khoá:parent::thuoctinhparent::phuong_thuc() , parent::  biểu thị cho các thuộc tính và phương thức được gọi từ class cha. 

ví dụ:

// Lớp Con Người
class ConNguoi
{
    // Thuộc Tính
    var $tai         = '';
    var $mat       = '';
    var $mui       = '';
    var $mieng   = '';
    var $chan     = '';
    var $tay        = '';
    var $gioitinh  = '';
  
    // Hàm, phương thức
    function di(){
        // lệnh
    }
  
    function dung(){
        // lệnh
    }
  
    function an(){
        // lệnh
    }

    function uong(){
        // lệnh
    }
      function ngu(){
        echo 'Con người ngủ đêm';
    }
    
    function nghi(){
        // lệnh
    }
}
  
// Lớp TreCon
class TreCon extends ConNguoi
{
    function gioi_thieu()
    {
        $this->mat = 'Đây là cái mặt';
        $this->mui = 'Đây là cái mũi';
        parent::ngu(); // xuất ra chuỗi "Con người ngủ đêm"
    }
}

 

+ Gọi từ bên ngoài: tương tự như cách gọi từ bên trong nhưng k sử dụng từ khoá:parent::thuoctinhparent::phuong_thuc()   

ví dụ:

//Lớp Con Người
class ConNguoi
{
    // Thuộc Tính
    var $tai         = '';
    var $mat       = '';
    var $mui       = '';
    var $mieng   = '';
    var $chan     = '';
    var $tay        = '';
    var $gioitinh  = '';
  
    // Hàm, phương thức

    function uong(){
        // lệnh
    }
      function ngu(){
        echo 'Con người ngủ đêm';
    }
    
    function nghi(){
        // lệnh
    }
}
  
// Lớp TreCon
class TreCon extends ConNguoi
{
    function gioi_thieu()
    {
        $this->mat = 'Đây là cái mặt';
        $this->mui = 'Đây là cái mũi';
        parent::ngu(); // xuất ra chuỗi "Con người ngủ đêm"
    }
}

// Chương Trình
$tre_con = new TreCon();
  
// Gọi đến hàm gioi_thieu trong lớp Trẻ Con
// nên xuất ra màn hình chuỗi "Con người ngủ đêm"
$tre_con->gioi_thieu();
  
// Trong hàm giới thiệu có gán giá trị cho 2
// thuộc tính mắt và mũi, giờ ta xuất ra màn hình
// xem giá trị nó là gì
  
echo $tre_con->mat;
echo $tre_con->mui;

 

0