2012-01-31 72 views
0

我有這個類防止父類「遺忘」本地變量兒童設置:PHP

class Validator implements iValidation{ 
    protected 
     $_fields, 
     $_errors; 
    public function __construct($fields){ 
     $this->_errors = array(); 
     $this->_fields = $fields; 
    } 
    public function validate(){ 
     $map = unserialize(iValidation::map); 
     foreach ($this->_fields as $field_type => $data){ 
      if (array_key_exists($field_type, $map)){ 
       $class = "Validate_{$map["$field_type"]}" ; 
       $object = new $class($data); 
       $object->validate(); 
       unset($object); 
      }    
     } 
    } 
    public function getErrors(){ 
     return $this->_errors; 
    } 
} 

現在,這個類遍歷數組的形式給出

$admin_test_data = array(
    "firstname" => "Alex1", 
    "surname" => "Morley-Finch", 
    "username" => "alex123", 
    "password" => "cheese", 
    "re_password" => "cheese", 
    "email_address" => "alex54353hotmail.co.uk", 
    "user_type" => "ADMIN", 
    "add_admin" => "Add Admin", 
); 

我有一張地圖,描述了每個字段的驗證類型,聲明如下:

define(
    "VALIDATION_MAP", 
    serialize(
      array(
       // FIELD => VALIDATION TYPE 
       "firstname" => "Name", 
       "surname" => "Name", 
       "agency_name" => "Agency_Name", 
       "agency_office" => "Name", 
       "username" => "Username", 
       "email_address" => "Email_Address", 
       "password" => "Password", 
      ) 
    ) 
); 

interface iValidation{ 
    public function __construct($data); 
    public function validate(); 
    const map = VALIDATION_MAP; 
} 

而且我有子類其中之一是像這樣:

class Validate_Name extends Validator implements iValidation{ 
    private $_data; 
    public function __construct($data){ 
     $this->_data = $data; 
    } 
    public function validate(){ 
     $data = $this->_data; 
     $length = strlen($data); 
     if ($length > 40){ 
      $this->_errors[] = "Cannot be more than 40 characters"; 
     } 
     if ($length < 3){ 
      $this->_errors[] = "Cannot be less than 3 characters"; 
     } 
     if (!preg_match("/^[a-zA-Z]+$/", $data)){ 
      $this->_errors[] = "A-Z characters only"; 
     } 
    } 
} 

而整個框架用於像這樣:......讓這一切之後的背景資料

$validator = new Validator($admin_test_data); 
$validator->validate(); //^defined earlier ^^^ 
$errors = $validator->getErrors(); 

現在得到的問題。

我可能做了一些愚蠢至極,但我不能算出它和谷歌沒有做啓發我的一個很好的工作(或我不這樣做,要求谷歌方面做得很好)

子類參考$this->_errors[] = "This is the error";,並在子類中使用die(var_dump($this->_errors));時,該類的錯誤顯示爲應該顯示。

但是,如果我在類的外部調用die(var_dump($validator->getErrors()));,則該數組爲空。

Asif父母忘記了孩子們設置的所有價值觀?

怎麼回事?

回答

1

對於您在Validator中驗證的每個字段,創建iValidation所需實施的實例。

現在孩子驗證器驗證,並發現錯誤。它將這些錯誤添加到其_errors實例屬性中。

驗證完成後,子實例將被丟棄。這就是問題所在,因爲發現的錯誤被分配子實例的_errors屬性,不就是父實例的。

因爲這些屬性位於不同的對象中,所以什麼也沒有分配給Validator::_errors