【问题标题】:PHP interface in extended class not recognized as instance扩展类中的 PHP 接口未被识别为实例
【发布时间】:2019-04-21 07:35:09
【问题描述】:

我有一个抽象类A,它由实现接口I的类B扩展。

abstract class A {
  public function test(){
    return $this->getX();
  }
  abstract protected function getX();
}

class B extends A implements I {
  public function Test() {
    $x = this->getX();
    if (!$x instanceof I) {
      throw new RuntimeException("not an instance of I");
    }
  }

  public function getX() {
    $aCoordinates = array('x' => 1, 'y' => 4, 'z' => 5); 
    return $aCoordinates;
  }
}

interface I {}

RuntimeException 总是被抛出,尽管$xI 的一个实例。有人知道为什么会发生这种情况吗?

getX() 返回一个数组。 getX() 只是一个返回数组的函数的示例。

【问题讨论】:

  • 如果我没看错的话,这里的$x会被设置为10,这不是I的实例,而只是一个普通的整数,对吧?
  • 我已经更新了我的示例代码。实际上 $x 只是 getX() 的结果
  • getX 返回什么?不管它是什么,它也不是我的一个实例
  • @Jake 我们需要看看 getX() 返回什么来帮助你。
  • @Jake 如果 $x = getX(),因此 $x = 数组。数组不是您的接口的实例。这就是抛出异常的原因。

标签: php oop interface extends instanceof


【解决方案1】:

getX() 方法不返回任何数据所以$x 的值是null; 要拥有I 接口的对象实例,您需要将return $this 放入getX() 方法中。

【讨论】:

  • 确实如此。我只是在示例代码中忘记了它。
  • 现在 getX() 返回一个数组,当然它不是 I 接口的实例。您需要输入 return $this; 而不是 return $aCoordinates;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多