Như trong hầu hết các ngôn ngữ lập trình hướng đối tượng, bạn cũng có thể định nghĩa một hàm khởi tạo (constructor) trong một lớp (class) trong PHP. Khi bạn khai báo một đối tượng với toán tử new, các biến thành viên của nó không được gán giá trị nào. Hàm khởi tạo được sử dụng để khởi tạo mỗi đối tượng mới tại thời điểm khai báo. PHP cũng hỗ trợ việc có một hàm hủy (destructor) để xóa đối tượng khỏi bộ nhớ khi nó không còn bất kỳ tham chiếu nào.
PHP cung cấp một hàm __construct() để khởi tạo một đối tượng.
__construct(mixed ...$values = ""): void
Phương thức khởi tạo bên trong một lớp được gọi tự động cho mỗi đối tượng mới được tạo. Lưu ý rằng việc định nghĩa một phương thức khởi tạo không phải là bắt buộc. Tuy nhiên, nếu có, nó phù hợp cho bất kỳ việc khởi tạo nào mà đối tượng có thể cần trước khi được sử dụng.
Bạn có thể truyền vào bất kỳ số lượng tham số nào mà bạn muốn vào hàm khởi tạo. Hàm __construct() không có giá trị trả về.
Hãy định nghĩa một hàm khởi tạo trong lớp Book được sử dụng trong chương trước.
<?php class Book { /* Member variables */ var $price; var $title; /*Constructor*/ function __construct(){ $this->title = "PHP Fundamentals"; $this->price = 275; } /* Member functions */ function getPrice() { echo "Price: $this->price \n"; } function getTitle(){ echo "Title: $this->title \n"; } } $b1 = new Book; $b1->getTitle(); $b1->getPrice(); ?>
Nó sẽ tạo ra output −
Title: PHP Fundamentals Price: 275
Các biến thành viên của $b1 đã được khởi tạo mà không cần phải gọi các phương thức setTitle() và setPrice(), vì hàm khởi tạo đã được gọi ngay khi đối tượng được khai báo. Tuy nhiên, hàm khởi tạo này sẽ được gọi cho mỗi đối tượng, và do đó mỗi đối tượng sẽ có cùng giá trị cho các thuộc tính title và price.
Để khởi tạo mỗi đối tượng với các giá trị khác nhau, hãy định nghĩa hàm __construct() với các tham số.
Thay đổi định nghĩa của hàm __construct() thành như sau −
function __construct($param1, $param2) { $this->title = $param1; $this->price = $param2; }
Để khởi tạo đối tượng, hãy truyền các giá trị vào các tham số bên trong dấu ngoặc đơn trong phần khai báo.
$b1 = new Book("PHP Fundamentals", 375);
Bây giờ, bạn có thể có mỗi đối tượng với các giá trị khác nhau cho các biến thành viên.
<?php class Book { /* Member variables */ var $price; var $title; /*Constructor*/ function __construct($param1, $param2) { $this->title = $param1; $this->price = $param2; } /* Member functions */ function getPrice(){ echo "Price: $this->price \n"; } function getTitle(){ echo "Title: $this->title \n"; } } $b1 = new Book("PHP Fundamentals", 375); $b2 = new Book("PHP Programming", 450); $b1->getTitle(); $b1->getPrice(); $b2->getTitle(); $b2->getPrice(); ?>
Nó sẽ tạo ra output −
Title: PHP Fundamentals Price: 375 Title: PHP Programming Price: 450
Nạp chồng phương thức là một khái niệm quan trọng trong lập trình hướng đối tượng, trong đó một lớp có thể có nhiều định nghĩa của hàm khởi tạo, mỗi hàm có số lượng đối số khác nhau. Tuy nhiên, PHP không hỗ trợ nạp chồng phương thức. Hạn chế này có thể được khắc phục bằng cách sử dụng các đối số có giá trị mặc định trong hàm khởi tạo.
Thay đổi hàm __construct() thành như sau −
function __construct($param1="PHP Basics", $param2=380) { $this->title = $param1; $this->price = $param2; }
Bây giờ, khai báo một đối tượng mà không truyền tham số, và một đối tượng khác với tham số. Đối tượng không có tham số sẽ được khởi tạo với các đối số mặc định, đối tượng còn lại sẽ được khởi tạo với các giá trị đã truyền.
$b1 = new Book(); $b2 = new Book("PHP Programming", 450);
Nó sẽ tạo ra output −
Title: PHP Basics Price: 380 Title: PHP Programming Price: 450
Kể từ phiên bản PHP 7.0 trở đi, PHP cho phép khai báo kiểu scalar cho các tham số của hàm, hàm __construct() có thể được định nghĩa như sau -
function __construct(string $param1="PHP Basics", int $param2=380) { $this->title = $param1; $this->price = $param2; }
Trong các phiên bản trước của PHP, việc sử dụng tên của lớp để định nghĩa hàm khởi tạo là được phép, nhưng tính năng này đã bị loại bỏ kể từ phiên bản PHP 8.0.
PHP cũng có một hàm __destructor(). Nó thực hiện khái niệm hủy (destructor) tương tự như trong các ngôn ngữ lập trình hướng đối tượng khác, như C++. Phương thức hủy sẽ được gọi ngay khi không còn tham chiếu nào khác đến một đối tượng cụ thể.
__destruct(): void
Hàm __destruct() không có bất kỳ tham số nào, cũng như không có giá trị trả về. Thực tế rằng hàm __destruct() được gọi tự động khi bất kỳ đối tượng nào ra khỏi phạm vi, có thể được xác minh bằng cách đặt var_dump($this) bên trong hàm.
Như đã đề cập ở trên, $this mang tham chiếu đến đối tượng gọi, việc dump cho thấy rằng các biến thành viên được thiết lập thành NULL.
Thêm hàm hủy (destructor) vào lớp Book như sau −
function __destruct() { var_dump($this); echo "object destroyed"; }
Khi chương trình thoát, output sau đây sẽ được hiển thị −
object(Book)#1 (2) { ["price"]=> NULL ["title"]=> NULL } object destroyed