tôi đang học lớp PHP và trường hợp ngoại lệ, và, đến từ một C++ nền, sau cuộc đình tôi như lẻ:Phạm vi ươm trong constructor của lớp cha PHP
Khi các nhà xây dựng của một lớp có nguồn gốc ném một ngoại lệ, nó xuất hiện rằng destructor của lớp cơ sở không được chạy tự động:
class Base
{
public function __construct() { print("Base const.\n"); }
public function __destruct() { print("Base destr.\n"); }
}
class Der extends Base
{
public function __construct()
{
parent::__construct();
$this->foo = new Foo;
print("Der const.\n");
throw new Exception("foo"); // #1
}
public function __destruct() { print("Der destr.\n"); parent::__destruct(); }
public $foo; // #2
}
class Foo
{
public function __construct() { print("Foo const.\n"); }
public function __destruct() { print("Foo destr.\n"); }
}
try {
$x = new Der;
} catch (Exception $e) {
}
này in:
Base const.
Foo const.
Der const.
Foo destr.
Mặt khác, các destructors của các đối tượng thành viên là được thực thi đúng cách nếu có ngoại lệ trong hàm tạo (tại #1
). Bây giờ tôi tự hỏi: Làm thế nào để bạn thực hiện đúng phạm vi thư giãn trong một hệ thống phân cấp lớp trong PHP, để subobjects bị phá hủy đúng trong trường hợp ngoại lệ?
Ngoài ra, có vẻ như không có cách nào để chạy trình phá hủy cơ sở sau tất cả các đối tượng thành viên đã bị hủy (tại #2
). Để wit, nếu chúng ta loại bỏ dòng #1
, chúng tôi nhận được:
Base const.
Foo const.
Der const.
Der destr.
Base destr.
Foo destr. // ouch!!
Làm thế nào người ta sẽ giải quyết vấn đề đó?
Cập nhật: Tôi vẫn mở để đóng góp thêm. Nếu ai đó có lý do chính đáng tại sao hệ thống đối tượng PHP không bao giờ yêu cầu một chuỗi hủy diệt chính xác, tôi sẽ đưa ra một tiền thưởng khác cho điều đó (hoặc chỉ cho bất kỳ câu trả lời thuyết phục khác).
Tôi phải nói rằng tôi rất rất hiếm khi cần thiết để thực hiện các destructors trong PHP, vì vậy có lẽ nó không phải là một vấn đề. Bạn có nêu ra một câu hỏi hay. –
@Jani: Thành thật mà nói, với cách chúng được thiết kế, tôi hiểu tại sao bạn thực sự không muốn * muốn * sử dụng các destructors. Tôi chỉ tự hỏi tại sao chúng lại bị suy nghĩ rất tệ, và liệu có thành ngữ chung nào để phá vỡ lỗ hổng thiết kế này ngoài "không sử dụng phần này của ngôn ngữ" ...: -S –
Đồng ý với Jani: trong PHP thực sự không có điểm nào trong việc viết các destructors vì không có gì bạn có thể bị rò rỉ. Đến từ C++, có thể bạn đang xem các trình phá hủy như một công cụ rất tồi tệ để giải quyết một vấn đề mà họ không có ý định giải quyết. – Jon