我有这个班级
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() ) );
,则数组为空。
父母是否忘记了孩子们设定的所有价值观?
怎么回事?
答案 0 :(得分:1)
对于您在Validator
中验证的每个字段,您需要创建iValidation
所需实现的实例。
现在,子验证器验证,并发现错误。它将这些错误添加到其_errors
实例属性中。
完成验证后,子实例将被丢弃。这就是问题所在,因为找到的错误被分配给子实例的 _errors
属性,而不是父实例 。
没有任何内容被分配给Validator::_errors
,因为这些属性位于不同的对象中。