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上下文中的工作方式。一旦你有了继承性、可见性等,然后开始重新添加它们。在这个例子中继承的意义是什么?您应该首先了解什么是继承,它为什么有用,以及何时正确使用它。