【问题标题】:"Class contains 1 abstract method so must be declared abstract or implement the remaining methods (parent::hasErrors)" [closed]“类包含 1 个抽象方法,因此必须声明为抽象方法或实现其余方法(父级::hasErrors)”[关闭]
【发布时间】:2014-08-26 19:51:13
【问题描述】:

这是我的代码:

interface ValidatorInterface
{
  public function hasErrors ();
  public function validate (stdClass $metadata);
  public function getFeedback ();
}

abstract class ValidatorAbstract implements ValidatorInterface
{
  protected $feedback;

  public function __construct ()
  {
    $this->feedback = new FormFeedback();
  }


  public function getFeedback ()
  {
    return $this->feedback;
  }


  public function hasErrors ()
  {
    return $this->getFeedback()->hasErrors();
  }
}

class RegistrationValidator extends ValidatorAbstract
{
  public function validate (stdClass $metadata)
  {
    $this->getFeedback()->addError('Testing');

    return !!$this->hasErrors();
  }
}

这是错误:

致命错误:类 RegistrationValidator 包含 1 个抽象方法,因此必须声明为抽象方法或 实现剩下的方法 (ValidatorInterface::hasErrors)

抽象类ValidatorAbstract 满足ValidatorInterface 提出的具有hasErrors()getFeedback() 方法的要求。

RegistrationValidator 类扩展 ValidatorAbstract 并满足声明validate() 方法的最后一个要求。

为什么我会收到一个错误消息,指出 RegistrationValidator 包含一个抽象方法,而实际上它没有,并且当该方法已由其父类实现时,它必须实现 hasErrors()

【问题讨论】:

  • 请提供一个完整的可运行示例。我无法重现错误。

标签: php interface abstract-class


【解决方案1】:

确保您发布的代码与您正在运行的代码相同。在您发布的示例中,每个抽象方法都在层次结构中的某个位置实现,并且代码运行良好。

还要确保您正在编辑的文件是运行副本(它可以被缓存)。

【讨论】:

  • 实时代码实际上是几个文件。 ValidatorAbstract.php 显然是被缓存的那个。愚蠢的问题。一定是没有成功上传,因为这个服务器上没有 OpCode 缓存。
  • 最简单的问题往往最难找到:(
【解决方案2】:

在抽象类中,您至少需要有一个抽象方法。

abstract protected function someFunction();

一个好的做法是不要将任何代码放入抽象类中。

【讨论】:

  • 抽象类不需要有抽象方法。 BTW ValidatorAbstract 没有实现ValidatorInterface::validate,所以需要抽象。
  • 我完全相信这是必要的 - 感谢您的评论。
  • 不。你可以只使用一个抽象类来确保所有对象都具有相同的基本类型:)
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多