Hãy xem xét các giao diện PHP sau:Bạn có thể ghi đè các phương thức giao diện với chữ ký khác, nhưng "tương thích" không?
interface Item {
// some methods here
}
interface SuperItem extends Item {
// some extra methods here, not defined in Item
}
interface Collection {
public function add(Item $item);
// more methods here
}
interface SuperCollection extends Collection {
public function add(SuperItem $item);
// more methods here that "override" the Collection methods like "add()" does
}
Tôi đang sử dụng PHPStorm, và khi tôi làm điều này, tôi nhận được một lỗi trong IDE mà về cơ bản khẳng định các định nghĩa cho add()
trong SuperCollection
không tương thích với các định nghĩa trong giao diện nó mở rộng, Collection
.
Trong một cách, tôi có thể thấy vấn đề này là một vấn đề, vì chữ ký của phương thức không khớp với phương thức này "ghi đè" chính xác. Tuy nhiên, tôi cảm thấy rằng điều này sẽ tương thích, vì SuperItem
mở rộng Item
, vì vậy tôi sẽ xem add(SuperItem)
giống như add(Item)
.
Tôi tò mò muốn biết liệu điều này có được hỗ trợ bởi PHP (phiên bản 5.4 hoặc cao hơn) hay không, và có thể IDE có lỗi không đúng cách.
Trong 5.3, tôi nhận được "Fatal error: Tuyên bố của SuperCollection :: add() phải phù hợp với điều đó của Bộ sưu tập :: thêm () ". Vì vậy, có vẻ như PhpStorm là chính xác. Tại sao bạn nghĩ rằng 5.4 có thể hành xử khác nhau? – halfer