Tính kế thừa trong php – Freetuts

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

test php

banquyen png

Bài viết này được đăng tại

freetuts.net

, không được copy dưới mọi hình thức.

Nội dung bài học kinh nghiệm 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:

tinh ke thua png

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ì 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 thừa kế 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 thừa kế thì lớp có sẽ có những thuộc tính và phương pháp ở lớp cha, vậy làm thế nào để lớp con hoàn toàn có thể truy xuất đến những thuộc tính và phương pháp đó ? Ta sẽ tìm hiểu và khám phá trải 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.

Danh sách file tải về

Tên file tải về Pass giải nén
Tải bài học định dạng PDF freetuts.net hoặc gameportable.net