小编Ist*_*pai的帖子

在这种简单的情况下,PHP拒绝接受返回类型的原因是什么?

在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() {
    ;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意Upgradable接口中的升级功能如何需要Loginable返回类型,这是另一个接口.在此示例中,Person类内的升级方法将Loginable接口指定为其返回类型,以匹配接口的规定.

但是,如果我现在尝试更准确地指定Person类的升级方法的返回类型,则会遇到致命错误.

class Person implements Upgradeable {
  function upgrade(): PersonAccount {
    return new PersonAccount();
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里要完成的是指定升级方法将返回一个对象,该对象根据类实现的接口实现所需返回类型的接口.这对我来说似乎非常合乎逻辑和正确,但PHP会说:

致命错误:Person :: upgrade()声明:PersonAccount必须与Upgradeable :: upgrade()兼容:可登录[...]

正如yivi已经在/sf/answers/3454715351/指出的那样,我想要实现的目标是不可能的.

如果涉及扩展类,我会接受PHP的抱怨,因为扩展类可以覆盖原始方法,这样就不能保证正确的返回类型.但是,在上述场景中,不扩展类.只有接口的实现,其目的是明确保证正确的实现.

请详细说明PHP拒绝接受上述声明返回类型的方法背后的原因!

php oop interface return-type php-internals

9
推荐指数
1
解决办法
109
查看次数

标签 统计

interface ×1

oop ×1

php ×1

php-internals ×1

return-type ×1