GÜNCELLEME : PHP 7.4 artık bu soruda ortaya çıkan ana sorunu ele alan kovaryansı ve kontraveriansı destekliyor .
PHP 7'de dönüş türü ipucu kullanmakla ilgili bir sorunla karşılaştım. Anladığım kadarıyla ipucu : self
, bir uygulama sınıfının kendisini döndürmesini istediğiniz anlamına geliyor. Bu nedenle : self
arayüzlerimde bunu belirtmek için kullandım, ancak arayüzü gerçekten uygulamaya çalıştığımda uyumluluk hataları aldım.
Aşağıda karşılaştığım sorunun basit bir gösterimi var:
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");
Beklenen çıktı şuydu:
Fred Wilma Barney Betty
Aslında aldığım şey:
PHP Önemli hata: Foo :: bar bildirimi (int $ baz): Foo, iFoo :: bar (int $ baz) ile uyumlu olmalıdır: 7. satırdaki test.php içindeki iFoo
Mesele şu ki Foo, iFoo'nun bir uygulaması, bu yüzden uygulamanın verilen arayüzle mükemmel bir şekilde uyumlu olması gerektiğini söyleyebildiğim kadarıyla. Bu sorunu, kullanmak yerine arayüzü ada göre ipucu döndürmek için arabirimi veya uygulama sınıfını (veya her ikisini) değiştirerek çözebilirdim self
, ancak benim anladığım kadarıyla anlamsal olarak şu self
anlama geliyor: ". Bu nedenle, arayüze değiştirmek teoride, amacım çağrılan örnek için olduğunda, arayüzü uygulayan bir şeyin herhangi bir örneğini döndürebileceğim anlamına gelir.
Bu PHP'de bir gözetim mi yoksa kasıtlı bir tasarım kararı mı? Eski ise, PHP 7.1'de düzeltildiğini görme şansı var mı? Değilse, arabiriminizin zincirleme için yöntemi çağırdığınız örneği döndürmenizi beklediğini ima eden doğru dönüş yolu nedir?