Запрашивающий интерфейс, уже реализованный абстрактным родительским классом, потерпел неудачу с безопасностью типов - PullRequest
0 голосов
/ 03 июля 2019

Я хотел бы определить тип возвращаемого значения метода интерфейса ImpleInterface (), возвращающий сам интерфейс (AI) (например, свободный установщик), наследующий класс вендора, который реализует запрошенный интерфейс и уже имеет возвращаемый тип - нокажется невозможным в следующей ситуации.Может быть, это невозможно, а когда нет, каким может быть правильное решение?

Этот пример работает:

<?php
declare(strict_types=1);

/**
 * This interface is defined by the user
 */
interface AI
{
    public function implementedInterface();
}

/**
 * This class is immutable because it is vendor
 */
abstract class A
{
    public function implementedInterface(): self
    {
        return $this;
    }
}

/**
 * This class is defined by the user
 */
class B extends A implements AI
{
}

Это подход, который я хотел бы использовать, но в результате:PHP Fatal error: Declaration of A::implementedInterface() must be compatible with AI::implementedInterface(): AI

<?php
declare(strict_types=1);

/**
 * This interface is defined by the user
 */
interface AI
{
    public function implementedInterface(): AI;
}

/**
 * This class is immutable because it is vendor
 */
abstract class A
{
    public function implementedInterface(): self
    {
        return $this;
    }
}

/**
 * This class is defined by the user
 */
class B extends A implements AI
{
}
...