访问级别到某一类必须在PHP公众错误(Access Level to certain class m

2019-06-25 17:29发布

我创造了这个类

<?php
    abstract class Validator{
        public $_errors = array();
        abstract public function isValid($input);

        public function _addErrors($message){
            $this->_errors = $message;
        }

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


        public function getMessage(){
            return $this->message;
        }
    }

    class Validator_NoSpaces extends Validator{

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

    class Validator_MinimumLength extends Validator{

        protected $_minLength;
        protected $value;

        public function __construct($value ,$minLength=8){
            $this->_minLength = $minLength;
            $this->value = $value;
            $this->isValid($value);
        }

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

    class Form_Element_Validators extends Validator{

        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->_addErrors($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->hasErrors();
    }

    }

    class Form_Element extends  Form_Element_Validators{

        public function __construct($value){
              $this->addValidator(new Validator_NoSpaces($value));
              $this->addValidator(new Validator_MinimumLength($value));
        }
    }

为了进行验证,但它一直给我这个错误

Fatal error: Access level to Form_Element_Validators::_addErrors() must be public (as in class Validator) in C:\xampp\htdocs\beatbeast\includes\Db\Validators.php on line 91

但是,在这个类$ _errors实例变量声明为public,为什么我收到这个错误我不明白这一点。

Answer 1:

得到特殊照顾的错误,因为该方法的可见性必须相同或比它的上一个父类定义的限制较少。 在这种情况下,你有addErrorspublic对你的抽象类,并试图使其protected的子类。



Answer 2:

正如其他人所说,你不能让一个子类方法比母体更严格; 这是因为子类都应该为他们的父类的有效替代品。

你的具体情况,我会改变以下划线开始的所有方法和属性的可见性protected



Answer 3:

您所指定protected的访问protected function _addErrors(array $errors)的方法Form_Element_Validators类。 所以其变更为公开。

编辑:

你注意到了吗? 子类方法(覆盖方法)与定义的类型提示 。 请保持两个相同的参数类型; 超一流和子类中的方法。

 abstract class Validator{
        public $_errors = array();
        abstract public function isValid($input);

        public function _addErrors(array $message){
            $this->_errors = $message;
        }
        ....


文章来源: Access Level to certain class must be public error in PHP