Niveau d'accès à certaines classe doit être public d'erreur en PHP
J'ai créé cette classe
<?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));
}
}
à des fins de Validation, mais il continuait à me donner cette erreur
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
Mais la variable d'instance de cette classe $_errors est déclaré en public, je ne comprends pas pourquoi je reçois cette erreur.
Vous devez vous connecter pour publier un commentaire.
Vous d'obtenir cette erreur parce que la visibilité de la méthode doit être la même ou moins restrictive que celle de sa définition d'une classe parent. Dans ce cas, vous avez
addErrors
commepublic
sur votre classe abstraite et tentent de faireprotected
sur un enfant de la classe.Comme d'autres l'ont mentionné, vous ne pouvez pas faire une sous-classe de la méthode plus restrictif que le parent; c'est parce que les sous-catégories sont censés être un remplacement valable pour leur classe parent.
Dans votre cas particulier, je voudrais changer la visibilité de toutes les méthodes et propriétés qui commencent par un trait de soulignement pour
protected
.Node
etLeaf
, oùLeaf
est cas spécial deNode
, ainsiclass Leaf extends Node
. MaintenantNode
a unfunction addChild($child)
. Évidemment, je ne veux pas permettrefunction addChild($child)
dansLeaf
. La façon naturelle est à mettre privé (alors que dans la classe parente, elle est publique) de sorte qu'il ne peut pas être consulté. Ou vais-je hériterNode
deLeaf
?? 😮Vous avez spécifier le
protected
l'accès à laprotected function _addErrors(array $errors)
méthode deForm_Element_Validators
classe. Donc le changer pour le public.Edit:
Avez-vous remarqué? La sous-classe de la méthode (méthode de remplacement) est définie avec Type Hinting. Veuillez conserver le même type de paramètre pour les deux; super-classe et sous-classe de la méthode.
message
comme argument, et puis dans votreForm_Element_Validator
la classe du type allusion au fait que l'argument est unarray
soit supprimer learray
type indice de l'héritière de la méthode, ou de l'ajouter à la mère.Depuis PHP 7.2.0 il y avait un bogue #61970 fixe (Contention
__construct()
niveau d'accès dans la sous-classe donne une erreur fatale).Bump votre version de PHP à 7,2 et vous pouvez le faire
private
ouprotected
.