2012-06-25 16 views
5

Tôi tạo ra lớpAccess Level đến lớp nhất định phải lỗi nào trong 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)); 
     } 
    } 

này cho các mục đích Validation, nhưng nó giữ cho tôi lỗi này

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 

Nhưng biến cá thể trong lớp này $ _errors được khai báo là công khai, tôi không hiểu tại sao tôi nhận được lỗi này.

Trả lời

13

Bạn nhận được lỗi đó vì khả năng hiển thị của phương thức phải giống hoặc ít hạn chế hơn so với định nghĩa của phương thức trên lớp cha. Trong trường hợp này, bạn có addErrorspublic trên lớp trừu tượng của mình và đang cố gắng làm cho lớp đó là protected trên lớp con.

1

Bạn đã chỉ định quyền truy cập protected vào phương thức protected function _addErrors(array $errors) của lớp Form_Element_Validators. Vì vậy, thay đổi nó thành công khai.

Chỉnh sửa:

Bạn có nhận thấy không? Phương thức lớp con (phương pháp ghi đè) được định nghĩa với Type Hinting. Vui lòng giữ cùng loại thông số cho cả hai; phương pháp siêu lớp và phân lớp phụ.

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

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

Tôi đã thay đổi loại quyền truy cập thành công cộng nhưng nó đã cho tôi một lỗi khác, "Tiêu chuẩn nghiêm ngặt: Tuyên bố của Form_Element_Validators :: _ addErrors() phải tương thích với Validator :: _ addErrors() trong C: \ xampp \ htdocs \ beatbeast \ include \ Db \ Validator.php trên dòng 91 " – user962206

+1

@user: Thats bởi vì định nghĩa abastract của bạn có' message' làm đối số, và sau đó trong lớp 'Form_Element_Validator' của bạn, bạn có kiểu gợi ý rằng đối số là một' mảng' hoặc loại bỏ gợi ý kiểu 'mảng' từ phương thức con cháu, hoặc thêm nó vào phụ huynh. – prodigitalson

7

Như những người khác đã đề cập, bạn không thể tạo phương thức lớp con hạn chế hơn so với cha mẹ; điều này là do các lớp con được cho là một sự thay thế hợp lệ cho lớp cha của chúng.

Trong trường hợp cụ thể của bạn, tôi sẽ thay đổi mức hiển thị của tất cả các phương pháp và thuộc tính bắt đầu bằng dấu gạch dưới là protected.

+0

Tại sao lại như vậy? Hãy xem xét một cấu trúc cây. Nó sẽ có các lớp 'Node' và' Leaf', trong đó 'Leaf' là trường hợp đặc biệt của' Node', do đó 'lớp Leaf mở rộng Node'. Bây giờ 'Node' có' hàm addChild ($ child) '. Rõ ràng là tôi không muốn cho phép 'function addChild ($ child)' trong 'Leaf'. Cách tự nhiên là đặt chế độ riêng tư (trong khi ở cấp độ gốc là công khai) để không thể truy cập được. Hoặc tôi sẽ kế thừa 'Node' từ' Leaf' ?? : -o – sumid

+1

@sumid không, nếu bạn không muốn điều đó bạn chỉ đơn giản là sẽ ném một ngoại lệ. –

Các vấn đề liên quan