Tôi đã gặp phải vấn đề với việc sử dụng gợi ý kiểu trả về trong PHP 7. Sự hiểu biết của tôi là gợi ý : self
có nghĩa là bạn dự định cho lớp triển khai tự trả về. Vì vậy, tôi đã sử dụng : self
trong giao diện của mình để chỉ ra rằng, nhưng khi tôi cố thực sự triển khai giao diện, tôi gặp phải các lỗi tương thích.Giao diện PHP 7, trả về kiểu gợi ý và tự
Sau đây là một cuộc biểu tình đơn giản về vấn đề này tôi đã chạy vào:
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 dự kiến là:
Fred Wilma Barney Betty
Những gì tôi thực sự nhận được là:
PHP Fatal error: Declaration of Foo::bar(int $baz): Foo must be compatible with iFoo::bar(int $baz): iFoo in test.php on line 7
Điều là Foo là một thực hiện của iFoo, vì vậy theo như tôi có thể nói việc thực hiện nên được hoàn hảo comp với giao diện đã cho. Tôi có thể sửa chữa vấn đề này bằng cách thay đổi giao diện hoặc lớp thực hiện (hoặc cả hai) để trả về giao diện bằng tên thay vì sử dụng self
, nhưng hiểu biết của tôi là ngữ nghĩa self
có nghĩa là "trả về cá thể của lớp bạn vừa gọi phương pháp trên ". Do đó việc thay đổi nó thành giao diện sẽ có nghĩa là trong lý thuyết rằng tôi có thể trả về bất kỳ thể hiện của một cái gì đó thực hiện giao diện khi ý định của tôi là cho thể hiện được gọi là cái sẽ được trả về.
Đây có phải là sự giám sát trong PHP hay đây là quyết định thiết kế có chủ ý không? Nếu đó là trước đây là có bất kỳ cơ hội nhìn thấy nó cố định trong PHP 7.1? Nếu không thì cách trả về gợi ý chính xác là giao diện của bạn mong đợi bạn trả về cá thể bạn vừa gọi là phương thức cho chuỗi là gì?
Tôi nghĩ rằng đó là lỗi trong PHP trả về loại gợi ý, có lẽ bạn nên tăng nó thành [bug] (https://bugs.php.net/); nhưng bất kỳ bản sửa lỗi nào cũng không thể vào được bản 7.1 7.1 ở giai đoạn cuối này –
Vì phiên bản beta cuối cùng 7.1 đã được đưa lên mạng cách đây vài ngày, rất khó có thể sửa được 7.1. –
Không quan tâm, bạn đang đọc giải thích cách thức kiểu trả về 'self' được cho là hoạt động như thế nào? –