2008-10-23 40 views

Trả lời

23

Trong Addition Mark Biek của câu trả lời:

Các __destruct() chức năng phải được khai báo công cộng. Nếu không, chức năng sẽ không được thực hiện khi tắt kịch bản lệnh:

Warning: Call to protected MyChild1::__destruct() from context '' during shutdown ignored in Unknown on line 0 
Warning: Call to private MyChild2::__destruct() from context '' during shutdown ignored in Unknown on line 0 

Điều này có thể không gây hại, mà không bị ô uế.

Nhưng điều quan trọng nhất về điều này: Nếu destructor được khai báo là private hoặc protected, bộ thực thi sẽ ném một lỗi nghiêm trọng trong thời điểm này thu gom rác cố gắng đối tượng miễn phí:

<?php 
class MyParent 
{ 
    private function __destruct() 
    { 
     echo 'Parent::__destruct'; 
    } 
} 

class MyChild extends MyParent 
{ 
    private function __destruct() 
    { 
     echo 'Child::__destruct'; 
     parent::__destruct(); 
    } 
} 

$myChild = new MyChild(); 
$myChild = null; 
$myChild = new MyChild(); 

?> 

đầu ra

Fatal error: Call to private MyChild::__destruct() from context '' in D:\www\scratchbook\destruct.php on line 20 

(Cảm ơn Mark Biek vì một ví dụ tuyệt vời!)

+0

Đó là một câu trả lời thú vị. +1 cho bạn :) –

8

Tôi nghĩ rằng nó cần phải được công khai trong trường hợp một lớp con cần gọi rõ ràng phương thức __destruct của lớp cha.

Something như thế này sẽ ném ra một lỗi:

<?php 
class MyParent 
{ 
    private function __destruct() 
    { 
     echo 'Parent::__destruct'; 
    } 
} 

class MyChild extends MyParent 
{ 
    function __destruct() 
    { 
     echo 'Child::__destruct'; 
     parent::__destruct(); 
    } 
} 

$myChild = new MyChild(); 
?> 
Các vấn đề liên quan