在PHP 7.1.4中,使用严格类型,我有一个简单的面向对象设置,涉及一些接口和一些实现这些接口的类。下面的例子,正如您所期望的那样,可以正常工作。
注意,Upgradable接口内的升级函数需要返回类型为Loginable的接口。在本例中,Person类内的upgrade方法指定了Loginable接口作为其返回类型以匹配接口规定。
然而,如果我现在尝试更精确地指定Person类的upgrade方法的返回类型,我会遇到致命错误。
请注意,我在这里要实现的目标是指定升级方法将返回实现类所实现的接口所需的返回类型的对象。这对我来说似乎非常合理和正确,然而,PHP会报错:
致命错误:Person::upgrade()声明:PersonAccount必须与Upgradeable::upgrade(): Loginable兼容[...]
正如由yivi在https://stackoverflow.com/a/49353076/9524284中指出的那样,我想要实现的是不可能的。
如果涉及到扩展类,我会接受PHP的抱怨,因为扩展类可以覆盖原始方法,这样就无法保证正确的返回类型。但是,在上述情况下,没有扩展类,只有接口的实现,其整个目的就是明确保证正确的实现。
请阐明PHP拒绝接受上述声明返回类型方式背后的原因!
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类的upgrade方法的返回类型,我会遇到致命错误。
class Person implements Upgradeable {
function upgrade(): PersonAccount {
return new PersonAccount();
}
}
请注意,我在这里要实现的目标是指定升级方法将返回实现类所实现的接口所需的返回类型的对象。这对我来说似乎非常合理和正确,然而,PHP会报错:
致命错误:Person::upgrade()声明:PersonAccount必须与Upgradeable::upgrade(): Loginable兼容[...]
正如由yivi在https://stackoverflow.com/a/49353076/9524284中指出的那样,我想要实现的是不可能的。
如果涉及到扩展类,我会接受PHP的抱怨,因为扩展类可以覆盖原始方法,这样就无法保证正确的返回类型。但是,在上述情况下,没有扩展类,只有接口的实现,其整个目的就是明确保证正确的实现。
请阐明PHP拒绝接受上述声明返回类型方式背后的原因!