Trong lập trình hướng đối tượng thì luôn tồn tại 2 loại hàm với 2 chức năng trái ngược nhau:

  • Hàm khởi tạo – hàm giúp đối tượng được thực thi ngay khi đối tượng được khai báo. Hàm này được thiết lập các giá trị mặc định của đối tượng.
  • Hàm hủy – hàm tự động thực thi khi đối tượng bị hủy bỏ. Hàm này thường được dùng để thực hiện các hoạt động dọn dẹp trước khi chính thức xóa đối tượng.

1. Hàm khởi tạo (Constructor) trong hướng đối tượng PHP

Hàm khởi tạo đôi khi sẽ được gọi là hàm dựng. Hàm này thực ra cũng chỉ là một hàm bình thường được PHP tạo sẵn. Đặc điểm của nó là nó luôn luôn được gọi tới khi ta khởi tạo một đối tượng. Hàm có thể có tham số hoặc không, có giá trị trả về hoặc không có. Hàm khởi tạo có thể gọi một hàm bình thường khác và ngược lại.

Ta có 2 cách để khai báo phương thức khởi tạo:

Cách 1: Khai báo trùng với tên của class (PHP version > 7x sẽ không hỗ trợ nữa).

Ví dụ:

class Bi
{
    //Khai báo phương thức khởi tạo
    public function Bi()
    {
        echo 'Class Bi được khởi tạo';
    }
}

new Bi();
//kết quả: Class Bi được khởi tạo

Cách 2: Ta khai báo với phương thức có tên __construct

Ví dụ:

class SinhVien
{
    function __construct() {
        echo 'Lớp Sinh Viên vừa được khởi tạo';
    }
}
  
// khởi tạo lớp SinhVien
$sinhvien = new SinhVien();

Chú ý

  • Hàm construct được bắt đầu với 2 dấu gạch dưới __
  • Chúng ta cũng có thể thêm các tham số như một hàm thông thường.
  • Khi tạo một biến thuộc lớp, hàm này sẽ được gọi nên nếu có hàm có tham số chúng ta sẽ truyền tham số vào cặp dấu ngoặc.

2. Hàm hủy (Destructor) trong hướng đối tượng PHP

Hàm hủy được gọi khi đối tượng bị hủy hoặc tập lệnh bị dừng hoặc thoát. Nó dùng để giải phóng tài nguyên của một class và trong một class có thể có hoặc không có phương thức hủy.

Hàm hủy cũng sẽ bắt đầu bằng hai dấu gạch dưới __ và nếu ta tạo một hàm __destructor thì PHP sẽ tự động gọi nó ở cuối tập lệnh.

Ví dụ:

class Bi
{
    public function __destruct()
    {
        echo 'Class Bi được hủy';
    }
}

$foo = new Bi();
//kết quả: Class Bi được hủy

Và nếu ta có cả phương thức khởi tạo và phương thức hủy:

class Bi
{
    public function __construct()
    {
        echo 'Class Bi được khởi tạo';
    }

    public function getMessage()
    {
        echo 'Đây là class Bi';
    }

    public function __destruct()
    {
        echo 'Class Bi được hủy';
    }
}

$bi = new Bi();
//kết quả: Class Bi được khởi tạo
$bi->getMessage();
//kết quả: Đây là class Bi
//kết quả: Class Bi được hủy

3. Phương thức khởi tạo và hủy trong kế thừa

Khi một class có phương thức khởi tạo và phương thức hủy kế thừa một class cũng có phương thức khởi tạo và hủy thì phương thức khởi tạo và hủy sẽ nhận việc từ phương thức được kế thừa.

Tuy nhiên ta cũng sẽ phân ra một số trường hợp như sau:

Trường hợp 1: Nếu lớp con có hàm khởi tạo mà lớp cha cũng có hàm khởi tạo thì hàm khởi tạo của lớp con sẽ được chạy, còn hàm khởi tạo của lớp cha không được chạy. (tương tự với hàm hủy)

Ví dụ:

class A {
  
    function __construct() {
        echo 'Lớp A được khởi tạo';
    }
}
  
class B extends A {
  
    function __construct() {
        echo 'Lớp B được khởi tạo';
    }
}
  
$a = new B(); // Kết quả là Lớp B được khởi tạo

Trường hợp 2: Nếu lớp con không có hàm khởi tạo mà lớp cha có hàm khởi tạo thì hàm khởi tạo ở lớp cha sẽ được chạy.(tương tự với hàm hủy)

Trường hợp 3: Nếu lớp con có hàm khởi tạo mà lớp cha không có thì hàm khởi tạo lớp con được chạy.(tương tự với hàm hủy)

Trường hợp 4: Cả 2 lớp cha và con đều không có hàm khởi tạo thì đương nhiên là không có hàm nào được chạy!(tương tự với hàm hủy)