Узкий тип возврата в 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?
1 answers
Нет никакой гарантии, что Obj implements IObj
касается PHP. Поскольку вы можете в любое время переместить объявление Obj
в какой-либо другой файл, и поскольку файлы загружаются во время выполнения, а не на каком-то этапе компиляции, совершенно неизвестно, какая реализация Obj
будет загружена во время выполнения и будет ли это implements IObj
.
Итак, нет, вы не можете изменить тип возвращаемого значения в реализации, так как тогда вся безопасность типов выходит из окна. Безопасность типа может быть гарантирована только в том случае, если вы предварительно скомпилированный код, который заранее определяет, что именно Obj
будет.