PHP - Constructor và Destructor

Chào mừng bạn đến với hành trình vào thế giới lập trình PHP! Hôm nay, chúng ta sẽ cùng tìm hiểu hai hàm đặc biệt mà mọi lớp PHP có thể có: __construct()__destruct(). Đây được gọi là constructor và destructor, tương ứng, và chúng đóng vai trò quan trọng trong việc quản lý chu kỳ sống của một đối tượng. Hãy bắt đầu nhé!

PHP - Constructor and Destructor

Hàm __construct()

Hàm __construct() là một phương thức đặc biệt được gọi tự động khi một đối tượng được tạo ra từ một lớp. Nó giống như một buổi tiệc chào mừng cho đối tượng mới của bạn! Bạn có thể sử dụng nó để khởi tạo các thuộc tính hoặc thực hiện bất kỳ nhiệm vụ thiết lập nào cần thiết cho đối tượng của bạn.

Ví dụ 1: Constructor Cơ Bản

class Fruit {
public $name;

public function __construct($fruitName) {
$this->name = $fruitName;
}
}

$apple = new Fruit("Apple");
echo $apple->name; // Output: Apple

Trong ví dụ này, chúng ta định nghĩa một lớp Fruit với một constructor nhận một tham số, $fruitName. Khi chúng ta tạo một đối tượng mới của Fruit, chúng ta truyền "Apple" jako tham số, điều này thiết lập thuộc tính $name của đối tượng thành "Apple".

Constructor Đa Tham Số

Constructor đa tham số cho phép bạn truyền các tham số vào constructor, làm cho nó linh hoạt hơn. Bằng cách này, bạn có thể tạo ra các đối tượng với các trạng thái khác nhau dựa trên các tham số cung cấp.

Ví dụ 2: Constructor Đa Tham Số

class Car {
public $make;
public $model;
public $year;

public function __construct($make, $model, $year) {
$this->make = $make;
$this->model = $model;
$this->year = $year;
}
}

$myCar = new Car("Toyota", "Camry", 2020);
echo $myCar->make; // Output: Toyota
echo $myCar->model; // Output: Camry
echo $myCar->year; // Output: 2020

Trong ví dụ này, chúng ta đã mở rộng lớp Car để bao gồm một constructor đa tham số nhận ba tham số: $make, $model, và $year. Khi chúng ta tạo một đối tượng mới của Car, chúng ta có thể xác định các giá trị này, cho phép chúng ta tạo ra các xe với các hãng, mẫu và năm khác nhau.

Tải Constructor

Constructor tải không được hỗ trợ trực tiếp trong PHP, nhưng bạn có thể đạt được chức năng tương tự bằng cách sử dụng các tham số tùy chọn hoặc giá trị mặc định. Điều này cho phép bạn tạo ra nhiều constructor với số lượng hoặc loại tham số khác nhau.

Ví dụ 3: Tải Constructor (Sử dụng Tham Số Tùy Chọn)

class Book {
public $title;
public $author;
public $pages;

public function __construct($title, $author = null, $pages = null) {
$this->title = $title;
$this->author = $author;
$this->pages = $pages;
}
}

$book1 = new Book("Harry Potter");
$book2 = new Book("Lord of the Rings", "J.R.R. Tolkien");
$book3 = new Book("The Great Gatsby", "F. Scott Fitzgerald", 180);

Trong ví dụ này, chúng ta đã thêm các tham số tùy chọn vào constructor của Book. Khi tạo một đối tượng mới của Book, bạn có thể cung cấp chỉ tiêu đề, hoặc bạn cũng có thể cung cấp tác giả và số trang. Nếu bạn không cung cấp các tham số tùy chọn này, giá trị mặc định của chúng sẽ là null.

Khai Báo Loại Trong Constructor

Khai báo loại trong constructor của PHP không bắt buộc, vì PHP là một ngôn ngữ có thể thay đổi loại. Tuy nhiên, nếu bạn muốn thực thi kiểm tra loại, bạn có thể sử dụng hàm assert() trong constructor.

Ví dụ 4: Khai Báo Loại Trong Constructor (Sử dụng assert())

class Student {
public $name;
public $age;

public function __construct($name, $age) {
assert(is_string($name), "Name must be a string");
assert(is_int($age), "Age must be an integer");

$this->name = $name;
$this->age = $age;
}
}

$student = new Student("Alice", 25); // No error
$student2 = new Student(123, "Bob"); // Error: Name must be a string, Age must be an integer

Trong ví dụ này, chúng ta đã thêm các kiểm tra loại sử dụng assert() trong constructor của Student. Nếu các đối số cung cấp không khớp với các loại mong đợi, một lỗi sẽ được ném ra. Lưu ý rằng đây không phải là thực hành phổ biến trong PHP, vì nó có thể làm cho mã ít linh hoạt và khó bảo trì hơn.

Hàm __destruct()

Hàm __destruct() là một phương thức đặc biệt khác được gọi tự động khi một đối tượng bị hủy hoặc ra khỏi phạm vi. Nó giống như một buổi tiệc biệt phái cho đối tượng của bạn! Bạn có thể sử dụng nó để làm sạch tài nguyên, đóng kết nối hoặc thực hiện bất kỳ nhiệm vụ làm sạch nào trước khi đối tượng bị xóa khỏi bộ nhớ.

Ví dụ 5: Destructor Cơ Bản

class FileHandler {
private $file;

public function __construct($filename) {
$this->file = fopen($filename, 'r');
}

public function __destruct() {
fclose($this->file);
}
}

$fileHandler = new FileHandler('example.txt'); // Opens the file
// ... Do some operations with the file ...
// File is automatically closed when $fileHandler goes out of scope

Trong ví dụ này, chúng ta đã định nghĩa một lớp FileHandler mở một tệp trong constructor và đóng nó trong destructor. Khi chúng ta tạo một đối tượng mới của FileHandler và nó ra khỏi phạm vi (ví dụ: cuối của một script hoặc không còn được tham chiếu), destructor sẽ được gọi tự động, đóng tệp.

Đó là tất cả cho hôm nay! Chúng ta đã bao gồm các khái niệm cơ bản về constructor và destructor trong PHP. Nhớ rằng các phương thức đặc biệt này là những công cụ mạnh mẽ cho phép bạn kiểm soát chu kỳ sống của các đối tượng và đảm bảo quản lý tài nguyên đúng cách. Chúc bạn lập trình vui vẻ!

Credits: Image by storyset