2012-06-25 19 views
5

ich diese Klasse erstelltZugriffsebene auf bestimmte Klasse muss in PHP öffentliche Fehler sein

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

zu Validierungszwecken, aber es hat mir diesen Fehler geben

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 

Aber die Instanz-Variable in dieser Klasse $ _errors wird als öffentlich deklariert, ich verstehe nicht, warum ich diesen Fehler erhalte.

Antwort

13

Sie erhalten diesen Fehler, weil die Sichtbarkeit der Methode gleich oder weniger restriktiv sein muss als die Definition für eine Elternklasse. In diesem Fall haben Sie addErrors als public auf Ihrer abstrakten Klasse und versuchen, es protected für eine untergeordnete Klasse zu machen.

1

Sie haben den protected Zugriff auf die protected function _addErrors(array $errors)-Methode der Form_Element_Validators Klasse angegeben. Also ändere es in die Öffentlichkeit.

Bearbeiten:

Haben Sie bemerkt? Die Unterklassenmethode (überschriebene Methode) wird mit Type Hinting definiert. Bitte behalten Sie für beide den gleichen Parametertyp bei. Super-Klasse und Unterklasse-Methode.

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

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

Ich habe bereits seinen Zugriffstyp auf public geändert, aber es gab mir einen weiteren Fehler: "Strict Standards: Die Deklaration von Form_Element_Validators :: _ addErrors() sollte mit der von Validator :: _ addErrors() in C: \ xampp \ htdocs \ kompatibel sein beatbeast \ includes \ Db \ Validator.php in Zeile 91 " – user962206

+1

@user: Das liegt daran, dass Ihre abastract-Definition als Argument" message "hat, und dann haben Sie in Ihrer' Form_Element_Validator'-Klasse angegeben, dass das Argument ein 'array' ist Entweder entfernen Sie den Hinweis vom Typ "Array" von der abgeleiteten Methode oder fügen Sie ihn dem übergeordneten Element hinzu. – prodigitalson

7

Wie andere bereits erwähnt haben, können Sie eine Unterklassenmethode nicht restriktiver als die Elternklasse machen. Dies liegt daran, dass Unterklassen ein gültiger Ersatz für ihre Elternklasse sein sollen. In Ihrem speziellen Fall würde ich die Sichtbarkeit aller Methoden und Eigenschaften, die mit einem Unterstrich beginnen, in protected ändern.

+0

Warum ist es so? Betrachten Sie eine Baumstruktur. Es hat die Klassen 'Node' und' Leaf', wobei 'Leaf' ein Sonderfall von' Node' ist, also 'Klasse Leaf extend Node'. Jetzt hat 'Node' eine' function addChild ($ child) '. Natürlich will ich 'function addChild ($ child)' in 'Leaf' nicht erlauben. Der natürliche Weg besteht darin, es privat zu machen (während es in der Elternklasse öffentlich ist), so dass es nicht zugänglich ist. Oder soll ich "Node" von "Leaf" erben? : -o – sumid

+1

@sumid nein, wenn Sie nicht wollen, dass Sie einfach eine Ausnahme werfen würden. –