OOP trong PHP (1) - Class, object, constructor, destructor

1         OOP trong PHP

OOP là viết tắt của object oriented programming, là một phương pháp lập trình được sử dụng phổ biến.

Chương trình được viết theo phương pháp hướng đối tượng có tính tiến hóa, dễ mở rộng, dễ bảo trì và mã nguồn có tính tái sử dụng cao.

Một số kiến thức quan trọng cần tìm hiểu về phương pháp lập trình hướng đối tượng gồm:

– Làm sao để tạo lớp (class), tạo đối tượng (object)

– Tính đóng gói (encapsulation), hay che dấu dữ liệu (data hiding)

– Tính kế thừa (inheritance)

– Tính đa hình (polymorphism)

1.1       Làm sao để tạo lớp, tạo đối tượng

Đối tượng (object) là các thực thể trong thế giới thực (ví dụ: máy tính, sinh viên), hoặc là các khái niệm trừu tượng (ví dụ: tập tin, dữ liệu) cần biểu diễn (sử dụng) trong phần mềm.

Các đối tượng có đặc điểm giống nhau được xếp vào một nhóm hay một lớp (class). Ví dụ: lớp đối tượng SinhVien gồm các bạn đang học tại một trường cao đẳng/đại học, đối tượng TapTin gồm các đoạn dữ liệu được lưu trên đĩa.

Trong lập trình hướng đối tượng, người ta thường sử dụng từ khóa class để định nghĩa các đặc điểm và hành động chung của một lớp các đối tượng.

Một đối tượng sẽ là một đại diện cụ thể của một lớp đối tượng, ví dụ sinh viên Nguyễn Văn Tèo là một đại diện của lớp SinhVien. Cũng có thể gọi một đối tượng là một thể hiện (instance) của một lớp.

Công việc của lập trình viên là tạo ra các class trước, sau đó tạo ra các object từ các class đã có.

Tạo ra class là việc liệt kê các thuộc tính (attribute hay property) cùng với các hành động (method hay operation hay function) của một lớp đối tượng cụ thể.

Ví dụ:

class SinhVien { // định nghĩa lớp đối tượng

        public $hoTen; // thuộc tính

        public $diem; // thuộc tính

 

        function chao() { // phương thức, hành động

            echo 'Chao cac ban';

        }

    }

    $sv = new SinhVien(); // tạo ra đối tượng sv thuộc lớp đối tượng SinhVien

    $sv->chao(); // gọi phương thức

//=> Chao cac ban

1.2       Hàm khởi tạo

Hầu hết các class đều có một phương thức (hàm) đặc biệt là hàm khởi tạo (hay tạo lập, constructor), hàm này không có kiểu trả về, có tên là __construct(), thực hiện khởi tạo các biến thành viên, được thực thi tự động khi tạo ra đối tượng.

Ví dụ,

 class SinhVien {

        public $hoTen;

        public $diem; 

 

        function __construct() {

            echo "Hàm khởi tạo được gọi";

        }

    }

    $sv = new SinhVien();

//=> Hàm khởi tạo được gọi

Ví dụ, truyền tham số cho hàm khởi tạo

 class SinhVien {

        public $hoTen;

        public $diem; 

 

        function __construct($thamSo) {

            echo "Tham so truyen cho ham khoi tao la: " . $thamSo;

        }

    }

    $sv = new SinhVien('123');

    //=> Tham so truyen cho ham khoi tao la: 123

 

1.3       Hàm hủy

Ngược lại với hàm khởi tạo là hàm hủy (phương thức hủy, destructor). Hàm hủy thực hiện một số chức năng trước khi object bị hủy.

Hàm hủy có tên là __destruct(), sẽ tự động chạy khi object bị hủy. Không thể truyền tham số cho hàm hủy.

Ví dụ một số thao tác trong hàm hủy: ghi dữ liệu vào cơ sở dữ liệu, xuất thẻ đóng </body></html> của một tài liệu HTML.

Ví dụ hàm hủy:

    class SinhVien {

        public $hoTen;

        public $diem; 

 

        function __construct() {

            echo "<html><body>";

        }

        

        function __destruct(){

            echo "</body></html>";

        }

    }

    $sv = new SinhVien();

    echo "Thong tin sinh vien";

//=> <html><body>Thong tin sinh vien</body></html>

Object bị hủy khi nào?

Trong PHP, mỗi giá trị đều được lưu trong cấu trúc dữ liệu tên là zval. Trong cấu trúc zval, ngoài trường cho biết kiểu dữ liệu, giá trị của dữ liệu, còn có một trường (refcount) cho biết đang có bao nhiêu biến tham chiếu tới giá trị đó (reference count). Trong trường hợp dữ liệu là object thì refcount cho biết có bao nhiêu tham chiếu tới object.

Ví dụ:

class SinhVien {

        public $hoTen;

        public $diem; 

 

        function __construct() {

            echo "Ham khoi tao <br>";

        }

        

        function __destruct(){

            echo "<br>Ham huy";

        }

    }

    $a = new SinhVien();

    debug_zval_dump($a); // refcount(2): $a và debug_zval_dump tham chiếu tới một thể hiện của SinhVien

    $b = $a;

    $c = $b;

    debug_zval_dump($a); // refcount(4): $a, $b, $c, $debug_zval_dump

    unset($a);

    debug_zval_dump($b); // refcount(3): $b, $c, $debug_zval_dump  

Refcount có giá trị bằng 0 trong ba trường hợp sau:

– Mỗi lần gọi hàm unset(object) sẽ làm giá trị của refcount đi một giá trị

– Kết thúc hàm có chứa object

– Kết thúc chương trình

Ví dụ dưới đây minh họa trường hợp: sau hàm unset($a), hàm hủy sẽ được gọi,

$a = new SinhVien();

    unset($a);

    echo "<br> sau ham huy";

<///// 01 – OOP trong PHP

-----

Cập nhật: 19/4/2021

Đọc thêm: