2016-01-12 14 views
5

Trong các phiên bản hiện đại của PHP (5.6 dưới đây), sau đây là một chương trình không hợp lệTại sao "Tiêu chuẩn nghiêm ngặt" không áp dụng cho các nhà xây dựng PHP?

error_reporting(E_ALL); 
class A 
{ 
    public function hello(X $one, Y $two) 
    { 
    } 
} 

class B extends A 
{ 
    public function hello() 
    { 
    } 
} 

interface X 
{ 
} 

interface Y 
{ 
} 

$b = new B; 

PHP sẽ từ chối để chạy này, và thay vào đó cung cấp cho bạn một thông báo lỗi như sau

PHP Strict standards: Declaration of B::hello() should be compatible with A::hello(X $one, Y $two) in test.php on line 15 

Strict standards: Declaration of B::hello() should be compatible with A::hello(X $one, Y $two) in test.php on line 15 

này là một Thing ™ tốt từ một quan điểm nghiêm ngặt. Tuy nhiên, nếu bạn thử cùng một chức năng với hàm khởi tạo

class A 
{ 
    public function __construct(X $one, Y $two) 
    { 
    } 
} 

class B extends A 
{ 
    public function __construct() 
    { 
    } 
} 

PHP không có vấn đề gì và sẽ chạy chương trình.

Có ai biết lịch sử và/hoặc ngữ cảnh kỹ thuật về lý do tại sao tiêu chuẩn nghiêm ngặt không áp dụng cho nhà thầu?

+1

Điều duy nhất tôi tìm thấy trong [thủ công] (http://php.net/manual/en/language.oop5.decon.php) là: * Không giống như với các phương pháp khác, PHP sẽ không tạo ra lỗi cấp E_STRICT thông báo khi __construct() được ghi đè với các tham số khác với phương thức __construct() cha mẹ có. * – Rizier123

+2

Tôi đoán rằng vì hàm tạo không bị quá tải php không quan tâm. Khi bạn cố gắng sử dụng hàm tạo, bạn sẽ sử dụng A() hoặc B() mới để các giá trị đó không xung đột. Nhưng trong trường hợp bạn đang cố gắng truy cập một phương thức php sẽ không biết cái nào nên gọi bởi vì nó chỉ khớp với tên của hàm –

Trả lời

4

Từ PHP Manual:

Lưu ý: nhà xây dựng Chánh không được gọi ngầm nếu lớp con định nghĩa một constructor. Để chạy một hàm tạo cha, một lời gọi tới parent :: __ construct() bên trong hàm tạo con là bắt buộc. Nếu đứa trẻ không định nghĩa một hàm tạo thì nó có thể được kế thừa từ lớp cha giống như một phương thức lớp bình thường (nếu nó không được khai báo là riêng tư).

Ngoài ra:

Không giống với các phương pháp khác, PHP sẽ không tạo ra một E_STRICT thông báo lỗi mức khi __construct() được ghi đè với các thông số khác nhau hơn so với __construct mẹ() phương pháp có.

Tính hữu ích của kế thừa sẽ bị hủy hoại nếu bạn yêu cầu cùng chữ ký hàm tạo trên tất cả các lớp mở rộng. Bạn có thể tưởng tượng yêu cầu cùng một chữ ký hàm tạo trên mỗi bộ điều khiển trong một ứng dụng không?

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