对某些类的访问级别必须是 PHP 中的公共错误


Access Level to certain class must be public error in PHP

我创建了这个类

<?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 中的实例变量被声明为公共的,我不明白为什么我会收到此错误。

您收到该错误是因为该方法的可见性必须与其在父类上的定义相同或更少。在这种情况下,您已在抽象类上addErrorspublic,并尝试将其protected在子类上。

正如其他人所提到的,你不能使子类方法比父类方法更严格;这是因为子类应该是其父类的有效替代品。

在您的特定情况下,我会将以下划线开头的所有方法和属性的可见性更改为protected

您已经指定了对Form_Element_Validators类的protected function _addErrors(array $errors)方法的protected访问。因此,将其更改为公共。

编辑:

你注意到了吗?子类方法(重写方法)是使用类型提示定义的。请为两者保留相同的参数类型;超类和子类方法。

 abstract class Validator{
        public $_errors = array();
        abstract public function isValid($input);
        public function _addErrors(array $message){
            $this->_errors = $message;
        }
        ....

自 PHP 7.2.0 以来,修复了一个错误 #61970(限制子类中的__construct()访问级别会产生致命错误)。

将您的PHP版本提高到7.2,您可以使其privateprotected

当您尝试使用特定防护装置执行某些操作时,也会发生这种情况。您可以添加

 protected $guard = "guard_name";

在模型中添加上面的行。这将解决问题。