PHP: Hàm tạo (Constructor) và hàm hủy (Destructor)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Constructor ¶

Cú pháp: void __construct ([ mixed $args = "" [, $... ]] )

Từ phiên bản PHP 5  cho phép các nhà phát triển khai báo các hàm tạo cho lớp. Hàm tạo sẽ có nhiệm vụ khởi tạo giá trị cho các thuộc tính của đối tượng của lớp đó trước khi đối tượng được đem sử dụng.

Lưu ý: Các hàm tạo của lớp cha sẽ không được gọi ngầm định nếu lớp con có định nghĩa hàm tạo. Lúc này, nếu bạn muốn thực thực thi hàm tạo của lớp cha thì ở trong hàm tạo của lớp con ta sẽ thực hiện câu lệnh parent::__construct().  Nếu lớp con không định nghĩa hàm tạo thì nó có thể được thừa kế hàm tạo từ lớp cha.

Ví dụ 1: Ví dụ về hàm tạo.

<?php
class BaseClass {
   function 
__construct() {
       print 
"Trong hàm tạo của lớp BaseClass\n";
   }
}

class 
SubClass extends BaseClass {
   function 
__construct() {
       
parent::__construct();
       print 
"Trong hàm tạo của lớp SubClass\n";
   }
}

class 
OtherSubClass extends BaseClass {
    
// Lớp này sẽ thừa kế hàm tạo của lớp BaseClass
    // do không định nghĩa hàm tạo

}

// Gọi tới hàm tạo của lớp BaseClass
$obj = new BaseClass();

// Câu lệnh này sẽ gọi tới hàm tạo của cả lớp BaseClass và SubClass
$obj = new SubClass();

// Gọi tới hàm tạo của lớp BaseClass
$obj = new OtherSubClass();
?>

Không giống với phương thức thông thường, PHP sẽ không phát sinh lỗi khi hàm tạo __construct() được ghi đè với sự khác nhau về tham số so với hàm tạo __construct của lớp cha.

Lưu ý là từ phiên bản PHP 5.3.3 thì những phương thức có tên trùng với tên của lớp nằm trong namespace sẽ không còn được coi là hàm tạo của lớp đó nữa. Đương nhiên là những lớp không nằm trong namespace sẽ không chịu ảnh hưởng bởi điều này.

Ví dụ 2: Hàm tạo của lớp nằm  trong namespace.

<?php
namespace Foo;
class 
Bar {
    public function 
Bar() {
        
// được hiểu là hàm tạo ở bản PHP 5.3.0-5.3.2
        // điểu là phương thức chính quy từ bản PHP 5.3.3
    
}
}

?>

Đương nhiên là PHP cũng cho phép bạn tải chồng (overloading) hàm tạo.

Ví dụ 3: Tải chồng hàm tạo.

<?php 
class 

    function 
__construct() 
    { 
        
$a func_get_args(); 
        
$i func_num_args(); 
        if (
method_exists($this,$f='__construct'.$i)) { 
            
call_user_func_array(array($this,$f),$a);
        } 
    } 
    
    function 
__construct1($a1
    { 
        echo(
'__construct with 1 param called: '.$a1.PHP_EOL); 
    } 
    
    function 
__construct2($a1,$a2
    { 
        echo(
'__construct with 2 params called: '.$a1.','.$a2.PHP_EOL); 
    } 
    
    function 
__construct3($a1,$a2,$a3
    { 
        echo(
'__construct with 3 params called: '.$a1.','.$a2.','.$a3.PHP_EOL); 
    } 

$o = new A('sheep');
$o = new A('sheep','cat'); 
$o = new A('sheep','cat','dog');

// Sẽ in ra: 
// __construct with 1 param called: sheep 
// __construct with 2 params called: sheep,cat 
// __construct with 3 params called: sheep,cat,dog 

?>

Hàm hủy (Destructor)

void __destruct ( void )

Từ phiên bản PHP 5 trở đi cung cấp cho ta khái niệm về hàm hủy giống như những ngôn ngữ lập trình hướng đối tượng khác như Java, C#, C++. Hàm hủy sẽ được gọi đến nếu như một đối tượng nào đó không còn được tham chiếu đến nữa, hoặc chương trình đang trong quá trình tự tắt.

Ví dụ 3: Ví dụ về hàm tạo.

<?php
class MyDestructableClass {
   function 
__construct() {
       print 
"Trong hàm tạo\n";
       
$this->name "MyDestructableClass";
   }

   function 
__destruct() {
       print 
"Đang hủy " $this->name "\n";
   }
}


$obj = new MyDestructableClass();
?>

Cũng giống như hàm tạo, các hàm hủy ở lớp cha sẽ không được gọi ngầm định, để thực hiện thì tạo cần lời gọi tường minh là parent::__destruct() trong thân của hàm hủy lơp con. Và cũng tương tự như hàm tạo thì lớp con có thể thừa kế hàm hủy của lớp cha nếu lớp con không khai báo hàm hủy nào.

Hàm hủy sẽ được gọi ngay cả khi chương trình đang được dừng thông qua lời gọi hàm exit(). Nếu ta đặt lời gọi hàm exit() trong một hàm hủy thì hàm exit() sẽ không được thực thi.

Lưu ý:

Ta không thể ném một ngoại lệ từ hàm tạo, điều này sẽ phát sinh lỗi.

 
» Tiếp: Hằng (Constant) của lớp
« Trước: private, protected và public
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!