Php 用于从窗体获取值的动态窗体类

Php 用于从窗体获取值的动态窗体类,php,oop,Php,Oop,我使用Form类以静态方式获取表单的值。一切都很好。但我想动态地做。我想要一个表单类,它可以处理不同的表单。在display()方法中,我将获得姓名、电子邮件、密码、电话等的值。我希望当有或多或少的值时,或者在另一种形式中,表单类为我动态地完成这项工作。我该怎么做 //This is Register.php public function display() { Form::setname($_POST['name']); Form::email($_POST['email']

我使用
Form
类以静态方式获取表单的值。一切都很好。但我想动态地做。我想要一个表单类,它可以处理不同的表单。在display()方法中,我将获得姓名、电子邮件、密码、电话等的值。我希望当有或多或少的值时,或者在另一种形式中,表单类为我动态地完成这项工作。我该怎么做

//This is Register.php
public function display()
{
    Form::setname($_POST['name']);
    Form::email($_POST['email']);
    Form::password($_POST['pass']);
    Form::repassword($_POST['rpass']);
    Form::phone($_POST['phone']);

    list($name,$b,$c,$d,$e)=Form::getall();
}

<?php 
//This is Form.php
class Form
{
    private $name;
    private $email;
    private $pass;
    private $rpass;
    private $phone;

    public static function setname($name)
    {
        $this->name=$name; //  Using $this when not in object context 
    }

    public static function email($email)
    {
        $this->email=$email;
    }

    public static function password($pass)
    {
        $this->pass=$pass;
    }

    public static function repassword($rpass)
    {
        $this->rpass=$rpass;
    }

    public static function phone($phone)
    {
        $this->phone=$phone;
    }

    public static function getall()
    {
        $a=$this->name;
        $b=$this->email;
        $c=$this->pass;
        $d=$this->rpass;
        $e=$this->phone;
        return [$a,$b,$c,$d,$e];
    }
}
//这是Register.php
公共功能显示()
{
表单::setname($_POST['name']);
形式:电子邮件($_POST['email']);
形式:密码($_POST['pass']);
形式:重新密码($_POST['rpass']);
形式:电话(邮政"电话");;
列表($name,$b,$c,$d,$e)=表单::getall();
}

您可以尝试向类添加一个新变量数组,如

$dynamic_form_elements = array();
public static function dynamic_element($element, $value) {
    $this->dynamic_form_elements[$element] = $value;
}
之后,只需将$dynamic_form_elements变量放入列表中,以在getAll()方法中返回


你必须做几件事才能做到这一点。首先,避免静态。从概念上讲,每个表单都应该由它自己的对象表示。第二,使用PHP提供的神奇方法。这些都是非常强大的,如果使用得当,可以允许一些疯狂的好设计。第三,对单个表单中的所有输入元素使用带有单个名称的数组表示法,例如,对于表单元素的名称:使用类似于:
User[email]
的内容,而不仅仅是
email
User[name]
的内容,而不仅仅是
name
等等

记住这些,form类可以如下所示:

class Form{

    private $variables = array();

    public function __get($name){
        $returnValue = null;
        if(isset($this->variables[$name])){
            $returnValue = $this->variables[$name];
        }
        return $returnValue;
    }

    public function __set($name, $value){
        $this->variables[$name] = $value;
    }

    public function getAll(){
        return $this->variables;
    }

}
对于您需要的功能来说,这应该足够了。此外,您可以添加一个方便的函数,我发现它非常有用。这可以命名为
setAttrubites
setAll
函数。是这样的:

public function setAll($allData){
    foreach($allData as $key => $data){
        $this->variables[$key] = $data;
    }
}
$form = new Form();
$form->setAll($_POST['User']); 
<input type="text" name="User[name]" />
<input type="text" name="User[email]" />
这将允许您使用如下命令一次性设置所有变量:

public function setAll($allData){
    foreach($allData as $key => $data){
        $this->variables[$key] = $data;
    }
}
$form = new Form();
$form->setAll($_POST['User']); 
<input type="text" name="User[name]" />
<input type="text" name="User[email]" />
为了实现这一点,正如我前面提到的,所有输入元素都应该分组在一个数组中。因此,输入元素如下所示:

public function setAll($allData){
    foreach($allData as $key => $data){
        $this->variables[$key] = $data;
    }
}
$form = new Form();
$form->setAll($_POST['User']); 
<input type="text" name="User[name]" />
<input type="text" name="User[email]" />


希望你能理解其中的大意…

它工作得很好,我只需要在Form calss中使用一个setvalue和getvalue方法。并在display()方法中为特定字段每次调用它。这是好方法还是有更好的方法


为什么我应该使用用户[电子邮件]而不仅仅是电子邮件@这是不必要的。这只是为了方便起见,这样您就不必单独将所有输入字段指定给对象。这将允许您使用一行代码执行大量的赋值:
$form->setAll($\u POST['User'])如我的答案所示。。。您也可以选择只执行
$form->setAll($\u POST)
但是在答案中使用这个方法会使这个类更能证明未来…@fijas Ok great.Thanks你可以使用帖子左侧的向上箭头向上投票一个答案。此外,您可以通过单击答案旁边的勾号图标来接受答案。这篇文章详细解释了这一点:好的,我投票给你的答案。现在你能给我解释一下设置和获取方法是如何工作的吗@菲哈斯