php - 在 PHP 中实现抽象方法错误

标签 php oop abstract

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

<?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));
        //...
    }
}

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

但是第21行只包含这个

}

有什么我错过的吗?

即使我在 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 5 introduces abstract classes and methods. It is not allowed to create an instance of a class that has been defined as abstract. Any class that contains at least one abstract method must also be abstract. Methods defined as abstract simply declare the method's signature they cannot define the implementation.

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

abstract class Validator_AbstractValidator
{
    //...
}

更新:

class Form_Element_AbstractElement extends Validator_AbstractValidator implements Form_ElementInterface

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

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

接口(interface)验证器的实现:

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 , othermore .

关于php - 在 PHP 中实现抽象方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182836/

相关文章:

php - 水平形式的文本区域宽度

php - pear 邮件错误

oop - EIEIO 组合(通过自己的槽暴露包含对象的槽)

java - 我如何使抽象类与 JAXB 一起工作

c# - 从非泛型类覆盖抽象泛型方法

Java抽象类型类编译时检查

php - 当用户在 YII 中注销时,与 session 关联的行将被删除

php - 获取 mysql_query 脚本,在访问 php 站点后 30 秒执行

javascript - 如何获取父对象的函数(NodeJS模块)

java - 访问同一类中另一个对象的私有(private)字段