Bài 38: Trừu tượng hóa dữ liệu và tính kế thừa trong php

Ngày đăng: 2024-04-14 14:53:46

Mục lục:

       1. Trừu tượng hóa dữ liệu là gì ?

       2. Đối tượng trong thế giới thực và trong lập trình

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

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

       5. Kế thừa lồng là gì?

       6. Các mức độ truy cập trong kế thừa lồng

 

1. Trừu tượng hóa dữ liệu là gì ?

Trừ tượng hóa là quá trình đơn giản hóa một đối tượng mà trong đó chỉ bao gồm những đặc điểm quan tâm và bỏ qua những đặc điểm chi tiết nhỏ. Quá trình trừu tượng hóa dữ liệu giúp ta xác định được những thuộc tính, hành động nào của đối tượng cần thiết sử dụng cho chương trình.

Trừu tượng hóa dữ liệu là quá trình trừu tượng hóa một đối tượng một cách đủ thông tin để lưu vào hệ thống dữ liệu. Quá trình này rất giống với bộ phận phân tích hệ thống dữ liệu, lấy thông tin của khách hàng và trừu tượng hóa để đưa vào CSDL.

truu tuong hoa du lieu png

Ví dụ: Xây dựng chương trình quản lý sinh viên

Đối tượng: Các Sinh Viên.

Dữ liệu:

  • Họ Tên
  • Ngày Sinh
  • Giới Tính
  • Địa Chỉ
  • Học Lớp

Hành động:

  • Thêm Sinh Viên
  • Đuổi Sinh Viên
  • Đăng ký học phần cho Sinh Viên

Ta thấy có rất nhiều thuộc tính và hành động của sinh viên nhưng khi lưu vào hệ thống ta phải trừu tượng hóa lại CSDL, tức là sàn lọc thuộc tính, hành động cần thiết cho phần mềm quản lý sinh viên, bỏ đi những thuộc tính không cần thiết và hành động không cần thiết.

Tóm lại: Trừu tượng hóa dữ liệu là quá trình tổ chức một bài toán phức tạp thành những đối tượng có cấu trúc chặt chẽ, trong đó các dữ liệu và hành động của đối tượng được định nghĩa. Trong đối tượng dữ liệu và hành động có sự gắn kết chặt chẽ với nhau.

2. Đối tượng trong thế giới thực và trong lập trình

Đối tượng trong thế giới thực là một thực thể mà ta có thể sờ, nhìn thấy và cảm nhận được. Mỗi đối tượng đều có những thuộc tính, hành động riêng biệt.

Ví dụ:

doi tuong the gioi thuc png

Đối tượng trong lập trình dùng để mô tả, biểu diễn đối tượng trong thế giới thực, nó cũng có các thuộc tính hành động tác động lên nó (tác động lên dữ liệu).

Ví dụ: Lớp đối tượng mô tả con chó

 

class Dog

{

    // Thuộc Tính

    var $ten = '';

    var $mau = '';

    var $giong = '';

  

    // Hành Động

    function sua()

    {

        // lệnh

    }

  

    function vay_tai()

    {

        // lệnh

    }

  

    function chay()

    {

        // chạy

    }

  

    function an()

    {

        // ăn

    }

}

 

3. 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ật và Con 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.

Bài viết này được đăng tại [free tuts .net]

Đấ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

}

 

4. 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::thuoctinhparent::phuong_thuc().

Ví dụ:

 

<strong>/ 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"

    }

}</strong>

 

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()).

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;

 

5. Kế thừa lồng là gì?

Kế thừa lồng  hay còn gọi là kế thừa nhiều lớp, nghĩa là một lớp được kế thừa từ nhiều lớp. Lớp B kế thừa lớp A, lớp C kế thừa lớp B và thế là ta có luồng kế thừa  A -> B -> C. Một ví dụ khác thực tế hơn, giả sử Ông mình sinh ra Ba mình, Ba mình sinh ra mình như vậy mình kế thừa dòng máu của Ông mình và Ba mình.

Ví dụ:

 

class A {

  

}

  

class B extends A {

  

}

  

class C extends B {

  

}

 

Nhìn ví dụ thật đơn giản phải không nào, nhưng đi sâu vào bên trong nó không đơn giản tí nào đâu. Vấn đề đặt ra là khi kế thừa nhiều cấp như vậy thì các biến (thuộc tính), các hàm (phương thức) ở các lớp cha được sử dụng ở lớp con như thế nào ? Để hiểu rõ hơn vấn đề này ta sẽ đi qua phần hai.

6. Các mức độ truy cập trong kế thừa lồng

Như ta đã biết có 3 mức độ truy cập hay dùng nhất đó là private, public và protected. Cũng như trong kế thừa một cấp, tất cả những biến (thuộc tính) và hàm (phương thức) ở dạng public thì ở tất cả các lớp con dù ở cấp độ nào nó cũng có thể truy xuất vào được. Nếu ở dạng private thì chỉ dùng trong lớp đó. Nếu ở dạng protected thì tất cả các lớp kế thừa nó dù là lồng bao nhiêu lần thì cũng có thể sử dụng. Định nghĩa này chúng ta đã được học ở bài trước và cũng được giữ nguyên cho bài kế thừa lồng này.

Ví dụ:

 

// Lớp A

class A

{

    protected $protected_A = 'Protected';

    private $private_A = 'Private';

    public $public_A = 'Public';

  

    private function showPrivate()

    {

        echo $this->private_A;

    }

  

    protected function showProtected()

    {

        echo $this->protected_A;

    }

  

    public function showPublic()

    {

        echo $this->public_A;

    }

}

  

// Lớp B Kế Thừa Lớp A

class B extends A

{

    public function ClassB()

    {

        echo $this->protected_A;

    }

}

  

// Lớp C Kế Thừa Lớp B

class C extends B

{

    public function showInfo()

    {

        // Lệnh này đúng vì nó truy xuất vào thuộc tính protected

        $this->protected_A = 'Nguyễn Văn A';

  

        // Lệnh này đúng vì nó truy xuất vào thuộc tính public

        $this->public_A = 'Nguyễn Văn B';

  

        // Lệnh này sai vì nó truy xuất vào thuộc tính private

        $this->private_A = 'Lệnh sai';

    }

}

  

// ------------------//

// Chương trình chính//

// ------------------//

  

// Khởi tạo lớp C

// Lớp C được kế thừa từ lớp B

// mà lớp B kế thừa từ lớp A nên

// suy ra nó kế thừa từ 2 lớp A, B

$c = new C();

  

// Lệnh này đúng vì gọi đến hàm public của lớp cha A

$c->showPublic();

  

// Lệnh này sai vì nó gọi hàm protected của lớp cha A

$c->showProtected();

  

// Lệnh này sai vì nó gọi hàm private của lớp cha A

$c->showPrivate();

  

// Lệnh này đúng vì nó truy xuất vào hàm public của lớp cha B

$c->ClassB();

 

Qua các phần ghi chú trong ví dụ tôi đã giải thích cho các bạn rồi. Như vậy là các bạn thấy nó cũng không có gì đặc biệt đúng không nào.

 

Về bài trước...

                                Bài tiếp theo...

 

 


Tài liệu lập trình PHP

Bài viết trong cùng chuyên mục

Góc games giải trí



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Tower game

Plapy Bird (NH.Đông)

Vượt chướng ngại vật



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

Comment

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn cho sự phát triển của website này. Xin chân thành cảm ơn!

Trả lời

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

Trả lời

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

Trả lời

 +   -:

Trả lời

 +   -:

Trả lời

12815