CẬP NHẬT : PHP 7.4 hiện hỗ trợ hiệp phương sai và phương sai giải quyết vấn đề chính được nêu ra trong câu hỏi này.
Tôi đã gặp phải vấn đề gì đó với việc sử dụng hàm trả về kiểu gợi ý trong PHP 7. Tôi hiểu rằng gợi ý : self
có nghĩa là bạn dự định cho một lớp triển khai tự trả về. Do đó, tôi đã sử dụng : self
trong các giao diện của mình để chỉ ra điều đó, nhưng khi tôi cố gắng triển khai thực tế giao diện, tôi đã gặp lỗi tương thích.
Sau đây là một minh chứng đơn giản về vấn đề tôi gặp phải:
interface iFoo
{
public function bar (string $baz) : self;
}
class Foo implements iFoo
{
public function bar (string $baz) : self
{
echo $baz . PHP_EOL;
return $this;
}
}
(new Foo ()) -> bar ("Fred")
-> bar ("Wilma")
-> bar ("Barney")
-> bar ("Betty");
Sản lượng mong đợi là:
Fred Wilma Barney Betty
Những gì tôi thực sự nhận được là:
PHP Lỗi nghiêm trọng: Khai báo Foo :: bar (int $ baz): Foo phải tương thích với iFoo :: bar (int $ baz): iFoo trong test.php trên dòng 7
Vấn đề là Foo là một triển khai của iFoo, theo như tôi có thể nói việc triển khai phải hoàn toàn tương thích với giao diện nhất định. Tôi có lẽ có thể khắc phục sự cố này bằng cách thay đổi giao diện hoặc lớp triển khai (hoặc cả hai) để trả về gợi ý giao diện theo tên thay vì sử dụng self
, nhưng hiểu biết của tôi là về mặt ngữ self
nghĩa "trả về phiên bản của lớp mà bạn vừa gọi phương thức trên ". Do đó, việc thay đổi nó thành giao diện có nghĩa là về lý thuyết, tôi có thể trả về bất kỳ trường hợp nào của thứ gì đó triển khai giao diện khi ý định của tôi dành cho thể hiện được gọi là thứ sẽ được trả về.
Đây là một sự giám sát trong PHP hay đây là một quyết định thiết kế có chủ ý? Nếu là bản cũ thì liệu có cơ hội thấy nó được sửa trong PHP 7.1 không? Nếu không thì đâu là cách trả về chính xác gợi ý rằng giao diện của bạn mong muốn bạn trả về thể hiện mà bạn vừa gọi phương thức trên để xâu chuỗi?