2012-02-05 36 views
8

Có tình huống nào mà phương pháp này sẽ không được gọi?Độ tin cậy là __destruct?

Tôi đang lưu trữ một biến quan trọng vào bộ nhớ cache liên tục ngay trước khi đối tượng bộ nhớ cache bị hủy. Biến này được sử dụng nhiều lần trong trang vì vậy tôi không muốn để cập nhật bộ nhớ cache với nó mỗi khi thay đổi biến ...

+1

Điều này có thể giúp: http://stackoverflow.com/questions/151660/php-destruct-method – stewe

+0

Hãy lưu ý rằng các đối tượng bị phá hủy theo thứ tự tùy ý khi tập lệnh chấm dứt, vì vậy nếu lưu trữ nội dung nào đó vào bộ nhớ cache liên tục yêu cầu quyền truy cập vào một đối tượng xử lý bộ nhớ cache 'khởi tạo' trước đây có thể là vấn đề ... – jgivoni

+0

có thể trùng lặp của [Khi nào \ _ \ _ hủy không được gọi trong PHP?] (http://stackoverflow.com/questions/2385047/when- sẽ-destruct-không-được-gọi-in-php) –

Trả lời

14

Hãy có một lớp: Mã

class A { 
    public function __construct(){ 
     echo "Construct\n"; 
    } 

    public function __destruct(){ 
     echo "Destruct\n"; 
    } 
} 

Và kiểm tra:

$test = new A(); 
die("Dead\n"); // Will output Construct; dead; Destruct 

$test = new A(); 
throw new Exception("Blah\n"); // Construct, Fatal error (no destruct) 

$test = new A(); 
require_once('invalid_file.php'); // Construct, Fatal error (no destruct) 

Vì vậy, về cơ bản: có những tình huống (lỗi nghiêm trọng) khi destructor sẽ không được gọi.

Ah và câu hỏi này có câu trả lời tương tự như thế này một: When will __destruct not be called in PHP? (+/-)

+3

Cá nhân, tôi sẽ xem xét rằng nhiều hơn một lỗi lập trình hơn một PHP không đáng tin cậy. Đó là thiết kế kém để không bắt được một ngoại lệ ném. – nickb

+0

@nickb có, bạn nói đúng thiết kế và lập trình thất bại, nhưng các trường hợp như 'include 'fatal_error.php'' là có thật (đặc biệt khi bạn đang xây dựng ứng dụng mô-đun) và đó sẽ là bài kiểm tra tiếp theo của tôi và câu trả lời sẽ vẫn là giống nhau. – Vyktor

3

Nó được gọi là càng sớm càng không có nhiều tài liệu tham khảo để mà đối tượng cụ thể, hoặc trong quá trình tự tắt máy. Tài liệu hướng dẫn cũng cho biết các destructors được gọi khi các kịch bản lệnh được kết thúc bằng exit().

Ngoài vấn đề được chỉ ra bởi TimWolla, tôi không biết bất kỳ vấn đề nào với trình phá hoại PHP.

Các vấn đề liên quan