【问题标题】:Implementing Abstract Methods in PHP error在 PHP 错误中实现抽象方法
【发布时间】:2012-06-25 02:26:40
【问题描述】:

我在这里创建了一个包含抽象方法的类,即使该方法被声明为抽象,它也总是向我返回此错误。这是我的全部代码

<?php
interface Validator{
    public function isValid($input);
    public function getErrors();
}

class Validator_AbstractValidator
{
    protected $_errors = array();

    abstract public function isValid($input);

    public function getErrors()
    {
        return $this->_errors;
    }

    protected function _addError($message){
        $this_errors[] = $message;
    }
}

class Validator_MinimumLength extends Validator_AbstractValidator
{
    protected  $_minLength;

    public function __construct($minLength)
    {
        $this_minLength = $minLength;
    }

    public function isValid($input){
         if (strlen($input) > $this->_minLength) {
            return true;
        } else {
            $this->_addError("Input must be at least {$this_minLength}");
            return false;
        }
    }
}

class Validator_NoSpaces extends Validator_AbstractValidator{

    public function isValid($input) {
        if (preg_match('/\s/', $input)){
            $this->_addError("Spaces are not allowed");
            return false;
        }
        return true;
    }
}


interface Form_ElementInterface extends Validator{ }

class Form_Element_AbstractElement extends Validator_AbstractValidator implements Form_ElementInterface
{

    protected $_validators = array();

    public function addValidator(Validator $validator)
    {
        $this->_validators[] = $validator;
    }

    public function getValidators()
    {
        return $this->_validators;
    }

    protected function _addErrors(array $errors)
    {
        foreach ($errors as $error) {
            $this->_addError($error);
        }
    }

    public function hasErrors()
    {
        return (count($this->getErrors()) !== 0);
    }

    public function isValid($input)
    {
        foreach ($this->_validators as $validator) {
            if (!$validator->isValid($input)) {
                $this->_addErrors($validator->getErrors());
            }
        }
        return !$this->hadErrors();
    }
}

class Form_Element extends Form_Element_AbstractElement
{
    public function __construct($value,$minLength = 8)
    {
        $this->addValidator(new Validator_NoSpaces($value));
        $this->addValidator(new Validator_MinimumLength($minLength));
        //...
    }
}

错误是这个致命错误:Validator_AbstractValidator 类包含 1 个抽象方法,因此必须声明为抽象方法或在 C:\xampp\htdocs\beatbeast\includes\Db\Validator.php 中实现其余方法 (Validator_AbstractValidator::isValid)第 21 行

但是第 21 行只包含这个

}

我有什么遗漏的吗?

即使我在 Class Validator_AbstractValidator 类中添加了 keyward 抽象,我也遇到了这个问题

Fatal error: Can't inherit abstract function Validator::isValid() (previously declared abstract in Validator_AbstractValidator) in C:\xampp\htdocs\beatbeast\includes\Db\Validator.php on line 57

但第 57 行再次只包含这个

{

【问题讨论】:

    标签: php oop abstract


    【解决方案1】:

    PHP 5 引入了抽象类和方法。不允许 创建已定义为抽象的类的实例。任何 包含至少一个抽象方法的类也必须是 抽象的。定义为抽象的方法只需声明该方法的 签名他们无法定义实现。

    如果一个类没有被声明为抽象,它就不能包含任何抽象方法。

    abstract class Validator_AbstractValidator
    {
        //...
    }
    

    更新:

    class Form_Element_AbstractElement extends Validator_AbstractValidator implements Form_ElementInterface
    

    您正在扩展一个抽象类(Validator_AbstractValidator)并同时实现接口Validator,这是不可能的。

    扩展类并单独实现接口,并在单独的类中实现接口Validator,而不是Validator_AbstractValidator,因为它是您之前已经声明的抽象类。

    接口Validator的实现:

    class from_validator_interface implement Validator{
        // you have to implement all the methods declared in the interface, in your case
        // `isValid` and `getErrors` both methods have to be implemented
    }
    

    抽象类Validator_AbstractValidator的扩展:

    class someClass extends Validator_AbstractValidator{
        // you don't need to implement all the abstract methods like interface
    }
    

    一些有用的链接: php.net、other 和 more。

    【讨论】:

      【解决方案2】:

      一旦我将abstract 添加到Validator_AbstractValidator,你的代码就可以正常工作,你说你已经这样做了。

      abstract class Validator_AbstractValidator
      { ...
      

      【讨论】:

      • 我已经添加了它但是我给了我这个错误 Can't inherit abstract function Validator::isValid() (previously declared abstract in Validator_AbstractValidator) in C:\xampp\htdocs\beatbeast\includes\Db \Validator.php 第 57 行
      • 听起来您正在测试的代码与您发布的不匹配。我可以通过将Form_Element_AbstractElement 抽象化并将isValid 重新声明为抽象来重现该错误。
      【解决方案3】:

      我在下面的代码中遇到了同样的错误:

      Interface Fruit
      {
         public function getCalories() ;
         public function countSeeds() ;
      }
      
      Interface Vegetable
      {
         public function getVitamins() ;
         public function getCalories() ;
      }
      
      class Tomato implements Fruit, Vegetable
      {
         ...
      }
      

      这是我的解决方案,我添加了第三个父界面。

      Interface Food 
      {
          public function getCalories() ;
      }
      
      Interface Fruit extends Food
      {
      
         public function countSeeds() ;
      }
      
      Interface Vegetable extends Food
      {
         public function getVitamins() ;
      }
      
      class Tomato implements Fruit, Vegetable
      {
         ...
      }
      

      【讨论】:

      • 如果这增加了价值,请考虑扩展问题,因为这不是答案。
      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 2015-08-31
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      相关资源
      最近更新 更多