Khi bạn đang phân lớp các đối tượng và muốn mở rộng mã khởi tạo, có hai cách tiếp cận. Ghi đè __construct() và triển khai phương thức khởi tạo mà hàm tạo siêu lớp của bạn gọi.Thực hành tốt nhất, ghi đè __construct() so với việc cung cấp phương thức init()
Phương pháp 1:
class foo
{
public function __construct ($arg1, $arg2, $arg3)
{
// Do initialization
}
}
class bar extends foo
{
public function __construct ($arg1, $arg2, $arg3)
{
parent::__construct ($arg1, $arg2, $arg3);
// Do subclass initialization
}
}
Phương pháp 2
class foo
{
public function init()
{
// Dummy function
}
public function __construct ($arg1, $arg2, $arg3)
{
// Do subclass defined initialization
$this -> init();
// Do other initialization
}
}
class bar extends foo
{
public function init()
{
// Do subclass initialization
}
}
Các tài liệu cho Zend Framework dường như làm nản lòng nhà xây dựng trọng và muốn bạn để ghi đè lên các phương pháp init, nơi cung cấp, nhưng điều này bằng cách nào đó chỉ doesn' Tôi cảm thấy đúng với tôi. Zend cũng có xu hướng làm một vài điều mà tôi không hài lòng vì vậy tôi không chắc liệu nó có nên được sử dụng như một ví dụ về thực hành tốt nhất hay không. Cá nhân tôi nghĩ rằng cách tiếp cận đầu tiên là đúng nhưng tôi đã nhìn thấy cách tiếp cận thứ hai thường đủ để tự hỏi nếu đó thực sự là những gì tôi nên làm.
Bạn có bất kỳ nhận xét nào về việc ghi đè __construct không? Tôi biết bạn phải cẩn thận khi nhớ gọi hàm tạo của lớp bậc trên, nhưng hầu hết các lập trình viên phải nhận thức được điều đó.
EDIT: tôi không sử dụng Zend, tôi chỉ sử dụng nó như một ví dụ về một codebase khuyến khích bạn sử dụng init() thay vì __construct trọng().
Xin lỗi, tôi nên rõ ràng hơn một chút trong câu hỏi của tôi. Tôi không sử dụng Zend, tôi đang làm việc trên mã mà tôi dự định phát hành cho công chúng vào một thời điểm nào đó trong tương lai nếu tôi cảm thấy nó có thể hữu ích. Tôi chỉ sử dụng Zend làm ví dụ, vì nó có xu hướng sử dụng phương pháp init, và nếu một khung chính đang làm điều đó thì phải có một lý do. (ngay cả khi cá nhân tôi không thích khuôn khổ được đề cập nhiều) – GordonM
Ah đúng. Có thể đáng để chỉnh sửa và đưa nó vào câu hỏi của bạn. Tôi đã chỉnh sửa bằng câu trả lời. –