Php 为什么在使用继承的类中未设置此变量?

Php 为什么在使用继承的类中未设置此变量?,php,arrays,oop,session-variables,Php,Arrays,Oop,Session Variables,我创建了一个类validation,它接受用户的输入并将其存储在名为user\u data的类属性中,我使用foreach循环来识别空字段,如果找到空字段,则使用isset()设置会话变量,在登录页面中向用户显示错误功能 然后我使用了继承的能力,创建了一些验证用户输入的子类 这里的问题是类验证中的$errors变量 和 未设置类password\u validate extensed validation,我在其中使用了会话变量$\u session['inval rep password']

我创建了一个类
validation
,它接受用户的输入并将其存储在名为
user\u data
的类属性中,我使用
foreach
循环来识别空字段,如果找到空字段,则使用
isset()设置会话变量,在登录页面中向用户显示错误
功能

然后我使用了继承的能力,创建了一些验证用户输入的子类

这里的问题是类
验证中的
$errors
变量 和 未设置类
password\u validate extensed validation
,我在其中使用了会话变量
$\u session['inval rep password']

我做错了什么?我该如何修复它

<?php 
session_start();
class validation{
    public $user_data; #storing users data
    public $errors; #storing errors that occurs

    #this function takes users data as an associative array and store it in class $user_data property
    public function __construct($data)
    {
        $this->user_data = $data;
        
        #searching for any empty user inputs
        foreach($this->user_data as $key => $value){
            if(empty($value)){
                #using session variables to display errors to users
                $_SESSION["$key"."_empty"] = "set";
                #storing the errors in $errors property of this class
                $this->errors[] = "empty $key"; 
            }else{
                unset($_SESSION["$key"."_empty"]);
            }
        }
        #using session variables to hold data in the text-box
        foreach($this->user_data as $key => $value){
            $_SESSION["$key" . "_value"] = $value;
        }
    }
}  

#real problem starts from here, the errors are not storing  
class email_validate extends validation{
    function __construct(){
        if(!filter_var($this->user_data['email'], FILTER_VALIDATE_EMAIL)){
            $this->errors[] = "inval email";
            $_SESSION['inval email'] = 'set';
        }else{
            unset($_SESSION['inval email']);
        }
    }
}
class password_validate extends validation{
    function __construct(){
        if(strlen($this->user_data['password']) < 6){
            $this->errors[] = "inval password";
            $_SESSION['inval password'] = 'set';
        }else{
            unset($_SESSION['inval password']);
        }
    }
}
#here is an other problem in this class
class repeat_password_validate extends validation{
    function __construct(){
        if($this->user_data['password'] !== $this->user_data['reppassword']){
            $this->errors[] = "inval repeat password";
            #this session is not getting set
            $_SESSION['inval rep password'] = 'set';
        }else{
            unset($_SESSION['inval rep password']);
        }
    }
}



$data = array("email" => "{$_POST['email']}", "password" => "{$_POST['password']}", "reppassword" => "{$_POST['reppassword']}");
$validation = new validation($data);

#executing validation
$email = new email_validate();
$password = new password_validate();
$repeated_password = new repeat_password_validate();
       

echo "<pre>";
print_r($validation->errors);
?>

子类构造函数必须调用
validation
构造函数。
$email
$password
$validation
是完全独立的对象。因此,
$validation->errors
将不包含
$email
$password
发现的错误。这并不是子类化的正确用法。我可以问一下,您是在尝试“使用OOP解决问题”还是在尝试“学习OOP概念”?如果您使用后者,我建议您暂时避免一些额外的抽象,例如会话、数据库甚至HTML/HTTP,以便了解OOP上下文中的工作方式。一旦你有了继承性、可见性等,然后开始重新添加它们。在这个例子中继承的意义是什么?您应该首先了解什么是继承,它为什么有用,以及何时正确使用它。