Bài 05: Tính kế thừa trong php

Tính kế thừa là một trong ba tính chất quan trọng của lập trình hướng đối tượng, nó đòi hỏi sự logic về phân tích các đối tượng trong phần mềm để từ đó đưa ra những mô hình design pattern giúp việc nâng cấp, bảo trì phần mềm dễ dàng hơn. Đây là tính chất được coi là quan trọng nhất bởi hầu hết các Framework trong PHP đều có sử dụng tính kế thừa, vì vậy nếu bạn đã xác định theo con đường lập trình PHP thì ắt phải hiểu về kế thừa.

Nội dung bài học như sau:

  • Tính kế thừa là gì?
  • Gọi phương thức và thuộc tính của lớp cha trong kế thừa

1. Tính kế thừa là gì?

Giả sử tôi có 2 lớp Động Vật và lớp Con Trâu có những thuộc tính và phương thức sau:

Nhìn vào hình ta thấy 2 đối tượng Động VậtCon Trâu có những đặc điểm chung và riêng. đối tượng Con trâu chỉ có một đặc tính khác đó là nó có sừng, còn đối tượng động vật thì không có. Vậy ta có nhận xét như sau: Con trâu cũng là một động vật nên nó có những đặc tính của động vật, hay nói cách khác nó có những đặc điểm và hành động của động vật, vì vậy con trâu có thể kế thừa nhưng đặc điểm và phương thức của động vật.

Đấy là ta đang nói đến tính kế thừa của các đối tượng trong thế giới thực, còn trong lập trình thì như thế nào ? 

Nếu khai báo thông thường thì ta sẽ tạo hai class như sau:

Lớp Động Vật:

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

Lớp Con Trâu:

class ConTrau
{
    // Thuộc Tính
    var $mat = '';
    var $mui = '';
    var $mieng = '';
    var $chan = '';
    var $gioitinh = '';
 
    // Thuộc tính này khác với động vật
    var $sung = ''; // con trâu có sừng
 
    // Hàm, phương thức
    function an(){
        // lệnh
    }
 
    function ngu(){
        // lệnh
    }
 
    function chay(){
        // lệnh
    }
 
    function lahet(){
        // lệnh
    }
}

Rõ ràng 2 đối tượng Động Vật và Con Trâu có những 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 dài như vậy? Vì thế trong 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.

Cú pháp như sau:

class classCon extends classCha {
}

Sau khi khai báo như vậy thì classCon sẽ có tất cả những thuộc tính, phương thức của classCha nên nó không cần phải viết lại.

Bài toán trên sẽ viết lại dưới dạng kế thừa như sau:

// Lớp Cha
class DongVat
{
    // Thuộc Tính
    var $mat = '';
    var $mui = '';
    var $mieng = '';
    var $chan = '';
    var $gioitinh = '';
 
    // Hàm, phương thức
    function an(){
        // lệnh
    }
 
    function ngu(){
        // lệnh
    }
 
    function chay(){
        // lệnh
    }
 
    function lahet(){
        // lệnh
    }
}
 
// Lớp Con
class ConTrau extends DongVat {
 
    // 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ày là cha ko có nên ta phải khai báo
    var $sung = '';
 
    // Tất cả các hàm, phương thức đều kế thừa từ cha
    // nên không cần viết lại
}

2. Gọi các phương thức và thuộc tính của lớp cha

Sau khi kế thừa thì lớp có sẽ có những thuộc tính và phương thức ở 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 và 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 và gọi từ bên ngoài lớp.

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 cha, hàm nào của con người ta hay gọi bằng từ khóa: parent::thuoctinh, parent::phuong_thuc().

Ví dụ:

/ Lớp Động Vật
class DongVat
{
    // Thuộc tính
    var $mat = '';
    var $mui = '';
 
    // Phương Thức
    function an()
    {
        echo 'Dong Vat Dang An';
    }
}
 
// Lớp Con Trâu
class ConTrau extends DongVat
{
    function gioi_thieu()
    {
        $this->mat = 'Đây là cái mặt';
        $this->mui = 'Đây là cái mũi';
        parent::an(); // xuất ra chuỗi "Động Vật Đang Ăn"
    }
}

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::thuoctinh, parent::phuong_thuc()).

Ví dụ:

// Lớp Động Vật
class DongVat
{
    // Thuộc tính
    var $mat = '';
    var $mui = '';
 
    // Phương Thức
    function an()
    {
        echo 'Dong Vat Dang An';
    }
}
 
// Lớp Con Trâu
class ConTrau extends DongVat
{
    function gioi_thieu()
    {
        $this->mat = 'Đây là cái mặt';
        $this->mui = 'Đây là cái mũi';
        parent::an(); // xuất ra chuỗi "Động Vật Đang Ăn"
    }
}
 
// Chương Trình
$contrau = new ConTrau();
 
// Gọi đến hàm gioi_thieu trong lớp Con Trâu
// nên xuất ra màn hình chuỗi "Động Vật Đang Ăn"
$contrau->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 $contrau->mat;
echo $contrau->mui;

3. Lời kết

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à thể hiện tính kế thừa trong php, qua các ví dụ các bạn biết cách gọi thuộc tính và phương thức của đối tượng cha từ bên trong lớp con và bên ngoài lớp con. Bài nay tôi hy vọng các bạn nắm vững phần lý thuyết cũng như thực hành để qua các bài sau sẽ hiểu được bài hơn. Bài tiếp theo chúng ta sẽ học các mức truy cập trong lập trình hướng đối tượng php.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.