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?
Đ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
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 –