Узкий тип возврата в PHP7


Возможно ли каким-то образом сузить тип возвращаемого значения в подсказках типа PHP7.1?

Следующий код вызывает фатальную ошибку Declaration of A::foo(): Obj must be compatible with IA::foo(): IObj, даже сужение возвращаемого типа не нарушает принципов наследования: Obj реализует IObj, поэтому ограничение типа возвращаемого родительского класса всегда будет выполнено при возврате экземпляра Obj.

interface IObj {}
class Obj implements IObj {}
interface IA {
    function foo(): IObj;
}

class A implements IA {
    function foo(): Obj {
        return new Obj();
    }
}

Я делаю что-то не так, или это недостаток PHP?

Author: amik, 2017-11-10

1 answers

Нет никакой гарантии, что Obj implements IObj касается PHP. Поскольку вы можете в любое время переместить объявление Obj в какой-либо другой файл, и поскольку файлы загружаются во время выполнения, а не на каком-то этапе компиляции, совершенно неизвестно, какая реализация Obj будет загружена во время выполнения и будет ли это implements IObj.

Итак, нет, вы не можете изменить тип возвращаемого значения в реализации, так как тогда вся безопасность типов выходит из окна. Безопасность типа может быть гарантирована только в том случае, если вы предварительно скомпилированный код, который заранее определяет, что именно Obj будет.

 5
Author: deceze, 2017-11-10 14:39:32