【问题标题】:Dynamic form class for getting value from a form用于从表单中获取值的动态表单类
【发布时间】:2015-05-18 04:41:56
【问题描述】:

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

//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];
    }
}

【问题讨论】:

    标签: php oop


    【解决方案1】:

    您可以尝试向类中添加一组新变量,就像

    $dynamic_form_elements = array();
    public static function dynamic_element($element, $value) {
        $this->dynamic_form_elements[$element] = $value;
    }
    

    之后,只需将 $dynamic_form_elements 变量放入您的列表中,以便在 getAll() 方法中返回。

    return [$a,$b,$c,$d,$e,$dynamic_form_elements];
    

    【讨论】:

      【解决方案2】:

      您必须做一些事情才能做到这一点。首先,避免静电。从概念上讲,每种形式都应该由它自己的对象来表示。其次,使用 PHP 提供的魔法方法。这些功能非常强大,如果使用得当,可以实现一些疯狂的好设计。第三,对单个表单中的所有输入元素使用单一名称的数组表示法,例如,对于表单元素的名称:使用类似:User[email] 而不仅仅是 emailUser[name] 而不仅仅是name 等等等等。

      记住这些,表单类可能如下:

      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;
          }
      
      }
      

      这应该足以满足您所需的功能。此外,您可以添加一个我发现非常有用的便利功能。这可以命名为setAttrubitessetAll 函数。应该是这样的:

      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]" />
      

      希望你明白这一点......

      【讨论】:

      • 为什么我应该使用 User[email] 而不仅仅是 email ? @fijas
      • 没必要。这只是为了方便,您不必将所有输入字段单独分配给对象。这将允许您使用单行进行大量作业:$form-&gt;setAll($_POST['User']);,如我的答案所示......您也可以选择只做$form-&gt;setAll($_POST);,但使用答案中的方法将使课程更加面向未来...... .
      • @fijas 好的,太好了。谢谢
      • 您可以使用帖子左侧的向上箭头对答案进行投票。此外,您可以通过单击该答案旁边的勾号图标来接受该答案。这篇文章详细解释:meta.stackexchange.com/a/5235/232195
      • 好的,我投票给你答案。现在你能解释一下 __set 和 __get 方法是如何工作的吗? @fijas
      【解决方案3】:

      工作正常,我只需要 Form calss 中的 setvalue 和 getvalue 方法。并且每次在 display() 方法中为特定字段调用它。是好还是有更好的方法?

      class Form{
      
      private $value;
      
      public  function setvalue($value)
      {
          $this->value=$value;
      }
      
      public function getvalue()
          {
              $a=$this->value;
              return $a;
          }
      }
      public function display()
      {
      $newform=new Form();
      $newform->setvalue($_POST['name']);
      $name=$newform->getvalue();
      
      $newform->setvalue($_POST['email']);
      $b=$newform->getvalue();
      
      $newform->setvalue($_POST['pass']);
      $c=$newform->getvalue();
      $newform->setvalue($_POST['rpass']);
      $d=$newform->getvalue();
      $newform->setvalue($_POST['phone']);
      $e=$newform->getvalue();
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 2021-08-06
        • 1970-01-01
        相关资源
        最近更新 更多