Bài 06: Tính kế thừa trong OPP PHP

PHP nâng cao 21/01/2017 10:23 750
Tính chất kế thừa là một trong những tính chất quan trọng trong lập trình PHP. Nó giúp chúng ta tạo ra các đối tượng(Object) một cách logic, mạc lạc và có hệ thống. Giảm thiếu đáng kể sự dư thừa về các dòng lệnh, tài nguyên...

1. Kế thừa là gì ?

Là một đối Object con sẽ nhận mọi thuộc tính và phương thức của Object cha làm thuộc tính và phương thức của nó nếu các thuộc tính & phương thức của Object cha có mức truy cập là publicprotected.

Cú pháp:

class classChild extends classParent {
     // Sone
}

Để làm rõ hơn câu trả lời này thì ta sét một ví dụ:

Tôi có hai loại động vật là Con Gà(Chicken) và Con chó(Dog) và chúng đại diện cho hai loại đối tượng khác nhau. Chúng có một số thuộc tính và phương thức sau.

Con Gà(Chicken) Con chó(Dog)

 1. Thuộc tính

- Mắt

- Mũi

- Chân

- Giới tính

- Cân nặng

2. Phương thức.

Ăn

Ngủ

Năng khiếu

Ấp trứng

 1. Thuộc tính

- Mắt

- Mũi

- Chân

- Giới tính

- Cân nặng

- Răng

2. Phương thức.

Ăn

Ngủ

Năng khiếu

Đánh hơi

Ta tiến hành xây dựng hai Class gồm các thuộc tính & phương thức cho hai đối tượng này như sau:

Lớp Con Gà(Chicken).

class Chicken {
    // Thuộc tính
    var $mat = '';
    var $mui = '';
    var $chan = 2;
    var $gioitinh = '';
    var $cannang = ''; 
    
    //Phương thức
    function an(){
        // Code
    }
    function ngu(){
        // Code
    }
    function nangkhieu(){
        // Code
    }
    function aptrung(){
        // Code
    }
}

Lớp con Chó(Dog).

class Dog {
    // Thuộc tính
    var $mat = '';
    var $mui = '';
    var $chan = 2;
    var $gioitinh = '';
    var $cannang = ''; 
    
    //Phương thức
    function an(){
        // Code
    }
    function ngu(){
        // Code
    }
    function nangkhieu(){
        // Code
    }
    function danhhoi(){
        // Code
    }
}

Ta thấy rằng đối tượng Con Chó có một thuộc tính Răng còn Con Gà thì không có. Con Gà có một phương thức là aptrung() còn Con Chó có phương thức danhhoi().

Ta có nhận xét về hai Object này như sau: Cả hai đối tượng trên đều có những đặc điểm chung và riêng.

Rõ ràng hai đối tượng Con Gà và Con Chó có những đặc điểm(thuộc tính và phương thức) giống nhau tại sao ta lại phải khai báo 2 đối tượng tách biệt? Và chúng ta có thể tạo ra một đối tượng cha chứa những tính chất chung của các đối tượng có tính chất gần giống nhau(gom nhóm) và các đối tượng đó(vài trò là con) sẽ thừa hưởng và mở rộng các đặc điểm của riêng nó.

Vì thế lập trình hướng đối tượng cung cấp chúng ta một tính chất để giải quyết vấn đề này đó là tính kế thừa.

Ta định nghĩa một đối tượng cha Anima có những thuộc tính & phương thức chung trong hai đối tượng trên. Và hai đối tượng Chicken & Dog sẽ kế thừa từ đối tượng Anima và hai đối tượng đó cũng có thuộc tính & phương thức của riêng nó.

class Animal {
    // Thuộc tính
    var $mat = '';
    var $mui = '';
    var $chan = '';
    var $gioitinh = '';
    var $cannang = ''; 
    
    //Phương thức
    function an(){
        // Code
    }
    function ngu(){
        // Code
    }
    function nangkhieu(){
        // Code
    }
}

class Chicken extends Animal{
    function aptrung(){
        // Lệnh
    }
}

class Dog extends Animal{
    var $rang = '';
    function danhhoi(){
        // Lệnh
    }
}

2. Truy xuất phương thức và thuộc tính của lớp cha

Sau khi kế thừa thì lớp con sẽ có những thuộc tính & phương thức của lớp cha, vậy làm thế nào để lớp con có thể truy xuất đến những thuộc tính & phương thức đó? Ta sẽ tìm hiểu thông qua hai cách gọi đó là gọi từ bên trong lớp con & gọi từ bên ngoài lớp.

2.1 Gọi bên trong lớp con

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 phương thức và thuộc tính đều coi như là của nó (coi như chứ không phải là của nó hẳn) nên cách gọi cũng như cách nó gọi các phương thức thuộc tính của nó, đó là từ khóa $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 gọi bằng từ khóa: parent::thuoctinhparent::phuong_thuc().

Ví dụ:

class Animal {
    // Thuộc tính
    var $mat = '';
    var $mui = '';
    
    //Phương thức
    function an(){
        echo 'Đang ăn';
    }
}

class Chicken extends Animal{
    function an(){
        echo 'Gà đang ăn';
    }
    function thong_tin(){
        $this->mat = 'Đây là cái mặt của tôi';
        $this->mui = 'Đây là cái mũi của tôi';
        // Gọi tới phương thức của chính nó.
        $this->an();
        // Gọi tới phương thức của cha nó.
        parent::an();
    }	
}
$chicken = new Chicken();
$chicken->thong_tin(); // Kết quả sẽ xuất ra thông báo là "Gà đang ăn" & Đang ăn.

2.1.2 Gọi từ bên ngoài lớp

Cách gọi cũng như cách 1 của phần gọi bên trong lớp con, tuy nhiên không được sử dụng cách 2 (parent::thuoctinhparent::phuong_thuc()).

$chicken = new Chicken();
$chicken->thong_tin(); // Kết quả: "Gà đang ăn" & Đang ăn.
echo $chicken->mat; // Kết quả: Đây là cái mặt của tôi

// Truy xuất sai.
echo parent::$mat;
echo parent::$mui;

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.