【发布时间】:2018-09-21 19:04:02
【问题描述】:
在 PHP 7.1.4 中,使用严格类型,我有一个简单的面向对象设置,涉及一些接口,以及一些实现这些接口的类。如您所料,下面的示例运行良好。
declare(strict_types=1);
interface Loginable {
public function login();
}
interface Upgradeable {
public function upgrade(): Loginable;
}
class Person implements Upgradeable {
function upgrade(): Loginable {
return new PersonAccount();
}
}
class PersonAccount implements Loginable {
public function login() {
;
}
}
请注意,Upgradable 接口中的升级功能如何需要 Loginable 返回类型,这是另一个接口。在本例中,Person 类中的 upgrade 方法将 Loginable 接口指定为其返回类型,以匹配接口的规定。
但是,如果我现在尝试更准确地指定 Person 类的升级方法的返回类型,则会遇到致命错误。
class Person implements Upgradeable {
function upgrade(): PersonAccount {
return new PersonAccount();
}
}
请注意,我在这里要完成的是指定升级方法将根据类实现的接口返回一个实现接口的对象,该接口是所需的返回类型。这对我来说似乎非常合乎逻辑和正确,但是 PHP 会说:
致命错误:Person::upgrade() 声明:PersonAccount 必须与 Upgradeable::upgrade() 兼容:可在 [...] 中登录
正如yivihttps://stackoverflow.com/a/49353076/9524284 已经指出的那样,我想要完成的事情是不可能的。
如果涉及扩展类,我会接受 PHP 的投诉,因为扩展类可以覆盖原始方法,这样就无法保证正确的返回类型。然而,在上述场景中,类没有被扩展。只有接口的实现,其全部目的是明确保证正确的实现。
请解释一下 PHP 拒绝接受上述声明返回类型的方式背后的原因!
【问题讨论】:
-
这是固定的,从 PHP 7.4 开始。
标签: php oop interface return-type php-internals