防止父类'遗忘'由儿童设置的本地变量:php

时间:2012-01-31 14:54:19

标签: php oop

我有这个班级

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() ) );,则数组为空。

父母是否忘记了孩子们设定的所有价值观?

怎么回事?

1 个答案:

答案 0 :(得分:1)

对于您在Validator中验证的每个字段,您需要创建iValidation所需实现的实例。

现在,子验证器验证,并发现错误。它将这些错误添加到其_errors实例属性中。

完成验证后,子实例将被丢弃。这就是问题所在,因为找到的错误被分配给子实例的 _errors属性,而不是父实例

没有任何内容被分配给Validator::_errors,因为这些属性位于不同的对象中。