2

ここで抽象メソッドを含むクラスを作成しました。そのメソッドが抽象と宣言されていても、常にこのエラーが返されます。これが私のコード全体です

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

エラーはこの致命的なエラーです: Class Validator_AbstractValidator には 1 つの抽象メソッドが含まれているため、C:\xampp\htdocs\beatbeast\includes\Db\Validator.php の 21 行目で、抽象として宣言するか、残りのメソッド (Validator_AbstractValidator::isValid) を実装する必要があります。

しかし、21行目にはこれしか含まれていません

}

見逃したものはありますか?

Class Validator_AbstractValidator クラスにキーワード抽象を追加したにもかかわらず、この問題が発生しました

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行目にはこれしか含まれていません

{
4

3 に答える 3

4

PHP 5 では、抽象クラスとメソッドが導入されています。抽象として定義されたクラスのインスタンスを作成することはできません。少なくとも 1 つの抽象メソッドを含むクラスも抽象でなければなりません。抽象として定義されたメソッドは、実装を定義できないメソッドのシグネチャを宣言するだけです。

クラスが抽象として宣言されていない場合、抽象メソッドを含めることはできません。

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その他など。

于 2012-06-25T02:42:11.890 に答える
0

abstractに追加すると、あなたのコードは私にとってはうまく機能Validator_AbstractValidatorします。

abstract class Validator_AbstractValidator
{ ...
于 2012-06-25T02:45:46.630 に答える
-1

次のコードで同じエラーが発生しました。

Interface Fruit
{
   public function getCalories() ;
   public function countSeeds() ;
}

Interface Vegetable
{
   public function getVitamins() ;
   public function getCalories() ;
}

class Tomato implements Fruit, Vegetable
{
   ...
}

これが私の解決策で、3 番目の親インターフェイスを追加しました。

Interface Food 
{
    public function getCalories() ;
}

Interface Fruit extends Food
{

   public function countSeeds() ;
}

Interface Vegetable extends Food
{
   public function getVitamins() ;
}

class Tomato implements Fruit, Vegetable
{
   ...
}
于 2014-08-04T20:55:28.943 に答える