[PHP] – Bài 6: Đối tượng và lập trình hướng đối tượng trong PHP

0

Trong bài học này, chúng ta sẽ cùng tìm hiểu về đối tượng, class và lập trình hướng đối tượng trong PHP.

Video Đối tượng và lập trình hướng đối tượng OOP trong PHP

Hướng dẫn chi tiết

Đối tượng

Đối với các bạn học IT lập trình thì khái niệm đối tượng, lập trình hướng đối tượng OOP chắc không có gì xa lạ. Các sách cũng như các trang chia sẻ kiến thức IT khác thường nói rằng đối tượng trong lập trình được dùng để mô hình hóa các vật thể trong thế giới thực. Ngoài ra có thể hiểu rằng, đối tượng là một kiểu dữ liệu do bạn tự định nghĩa ra.

Ví dụ, để mô tả 1 cái bàn, các bạn cần 1 biến số nguyên cho số chân bằng, 1 biến chuỗi cho màu sắc bàn. Với mỗi bàn, các bạn phải khởi tạo lại 2 biến rất mất thời gian và làm code dài dòng, khó kiểm soát hơn.

Class

Giải pháp thay thế, chúng ta có thể tạo một class Table có 2 thuộc tính là Số chân bàn và Màu sắc. Như vậy Table có tác dụng như một kiểu dữ liệu mới, tự định nghĩa, có thể tái sử dụng nhiều lần.

Class (lớp) là “bản vẽ” của một đối tượng, là mô hình của đối tượng. Khi nào cần tạo đối tượng (Object), chúng ta sẽ lấy các class đã tạo ra sử dụng.

Cấu trúc của một Class

+ Properties – các thuộc tính

+ Methods – các phương thức, bản chất của phương thức là hàm xử lý (function).

+ Hàm constructor là một phương thức class đặc biệt tự động được gọi khi bạn khởi tạo một object.

+ Hàm destructor là hàm được gọi khi đối tượng bị hủy hoặc tập lệnh bị dừng hoặc thoát.

class Table {
    public $mau_sac;
    public $so_chan_ban;
    function __construct($mau_sac, $so_chan_ban){
        $this->mau_sac = $mau_sac;
        $this->so_chan_ban = $so_chan_ban;
    }
    function __destruct(){
        echo 'Đối tượng đã bị xóa';
    }
    function intro(){
        echo 'Chiếc bàn có '.$so_chan_ban.' và có màu '.$mau_sac;
    }
}
$table = new Table('Đỏ', 4);
var_dump($table);
// thử truy cập vào thuộc tính của đối tượng
echo $table->mau_sac;

Đặc tính cơ bản của OOP

+ Tính trừu tượng:  đơn giản hóa một vật thể, giữ lại những thuộc tính hàng động cốt lõi, cần thiết để làm khuôn mẫu sử dụng cho chương trình.

+ Tính đóng gói: gom tất cả những thuộc tính và  với nhau để tạo thành một Đối tượng – Object. Đồng thời, chúng ta có thể kiểm soát mức độ truy xuất các thuộc tính bên trong class.

  • public: gọi thuộc tính bên trong class từ bất kỳ đâu
  • protected: gọi thuộc tính lớp cha từ lớp con khi đã kế thừa
  • private: chỉ có thể gọi từ lớp hiện tại. Cần có get và set để truy xuất dữ liệu.

+ Tính kế thừa: chúng ta có thể tạo ra các class mới bằng cách mở rộng từ các class đã có. Giúp kiểm soát tốt hơn code đã viết, và tiện cho việc phát triển dự án. PHP chỉ cho phép lớp con thừa kế từ 1 lớp cha.

+ Tính đa hình: như đã nói ở trên, với một class, chúng ta có thể sử dụng một class nhiều lần để tạo ra nhiều đối tượng khác với các đối số truyền vào khác nhau. Ngoài ra, sau khi kế thừa các thuộc tính và phương thức từ lớp cha, lớp con có thể ghi đè lại các phương thức của lớp cha để xử lý theo một cách khác.

Kế thừa class

class Table {
    public $mau_sac;
    public $so_chan_ban;
    function __construct($mau_sac, $so_chan_ban){
        $this->mau_sac = $mau_sac;
        $this->so_chan_ban = $so_chan_ban;
    }
    function intro(){
        echo 'Bàn màu '.$this->mau_sac.' có '.$this->so_chan_ban.' chân bàn';
    }
    function ham_tu_lop_cha(){
        echo 'Hàm từ lớp cha';
    }
    protected function ham_dac_biet(){
        echo 'Hàm cho lớp con sử dụng';
    }
}
class Table_Child extends Table{
    public $chat_lieu;
    function __construct($mau_sac, $so_chan_ban, $chat_lieu){
        $this->mau_sac = $mau_sac;
        $this->so_chan_ban = $so_chan_ban;
        $this->chat_lieu = $chat_lieu;
    } 
    function intro(){
        echo "Đây là chiếc bàn có màu {$this->mau_sac},có {$this->so_chan_ban} chân, và làm bằng {$this->chat_lieu}";
        parent::intro();
        parent::ham_dac_biet();
    }
}
$tb_child = new Table_Child('nâu', 4, 'gỗ');
$tb_child->ham_tu_lop_cha();
$tb_child->intro();

Kế thừa là một nguyên tắc lập trình được thiết lập tốt và PHP sử dụng nguyên tắc này trong mô hình đối tượng của nó. Nguyên tắc này sẽ ảnh hưởng đến cách nhiều lớp và đối tượng liên quan đến nhau. Điều này hữu ích để xác định và trừu tượng hóa chức năng và cho phép thực hiện chức năng bổ sung trong các đối tượng tương tự mà không cần phải thực hiện lại tất cả các chức năng được chia sẻ.

Ví dụ nhé, lớp Table và Table_Child đề mô tả về các bàn nhưng Tbale_Child mô tả chi tiết hơn. Do đó, thay vì tạo 2 class Table và Table_2 có những thuộc tính và phương thức giông nhau, chúng ta viết Table trước. Sau đó viết lớp Table_Child kế thừa những thuộc tính, phương thức đã có từ lớp cha (màu sắc và số chân bàn) và mở rộng viết thêm những thuộc tính và phương thức mới (chất liệu). Như vậy, mã nguồn sẽ nhất quán và liên kết chặc chẽ hơn.

Static properties và Static method

Là thuộc tính và phương thức có thể gọi mà không cần khởi tạo đối tượng.

class StaticTable {
    public static $vi_tri = 'Ngoài trời';
    public static function echo_table(){
        echo 'Đây là bảng';
    }
}
echo StaticTable::$vi_tri;
StaticTable::echo_table();

Bây giờ hãy thử gọi hàm intro() trong ví dụ đầu tiên mà không khởi tạo đối tượng $table thử xem chương trình có chạy được không nhé.

Abstract class và Interface

Abstract class (Lớp trừu tượng) sẽ định nghĩa các phương thức (hàm) mà từ đó các lớp con sẽ kế thừa nó và Overwrite lại (tính đa hình). Chúng ta có thể khai báo thuộc tính và phương thức.

abstract class Abs_Table{
    public $so_chan;
    public $mau_sac;
    public function intro(){
        echo 'haha';
    }
}

Interface (Giao diện, khuôn mẫu … Mình dịch sát nghĩa nhé) là một khuôn mẫu KHÔNG PHẢI ĐỐI TƯỢNG, giúp cho chúng ta tạo ra bộ khung cho một hoặc nhiều đối tượng. Chúng ta chỉ có thể khai báo phương thức trong interface.

interface In_Table{
    public function xep_chong();
    public function don_ban();
}

Điểm giống nhau giữa Abstract Class và Interface: Không thể khởi tạo đối tượng từ Abstract class hay Interface, cả hai chỉ có tác dụng làm khuôn mẫu.

Khác nhau giữa Abstract Class và Interface

Interface Abstract class
Chỉ có thể khai báo phương thức Khai báo thuộc tính và phương thức
Chỉ có thể kế thừa nhiều interface khác. Có thể kế thừa từ 1 lớp và nhiều interface.
Phạm vi truy cập mặc định là public Phạm vi truy cập là public, protected
Dùng để làm khuôn mẫu cho các phương thức Dùng để làm khuôn mẫu cho class
Dùng khi lớp kế thừa nó có chung một hành động Dùng khi lớp kế thừa nó có chung thuộc tính

Code mẫu: Download

Nếu có thắc mắc, hãy đặt câu hỏi bằng cách comment bên dưới, qua email, hoặc nhắn tin qua Fanpage Góc làm web.

Liên hệ

Để lại một trả lời

Địa chỉ email của bạn sẽ không được công bố.