如何在表单构建器类中创建不同的方法?

时间:2011-02-04 14:24:19

标签: php class

如果我创建一个新的PHP类,例如简化表单构建(是的,我知道有一些在那里),但我也试图了解类,所以请。要有耐心 - 谢谢......

好的我用通常的方式创建一个新类

这里的{p> class newform {课程详情}

添加构造函数

public function __construct() {函数在此}

然后我可以用通常的方式再次调用该课程

$newform = new newform();

到目前为止一直很好....(无论如何对我来说)。

现在我可以像这样添加一些args函数

public function __construct($args) {函数在此}

并在函数内部“遍历”args - 在我的例子中是一个如此写的数组

$newform = new newform($args = array('arg1'=>'arg1 val','arg2'=>'arg2 val'));

我可以做所有这些,但我如何“添加更多功能”我在这里的意思是,我必须为每个输入声明一个新类:即

$newform = new newform($args = array('arg1'=>'arg1 val','arg2'=>'arg2 val'));
$newform->textarea;

$newform = new newform($args = array('arg1'=>'arg1 val','arg2'=>'arg2 val'));
$newform->textinput;

这似乎“非常”长期缠绕在我身上,因此是错误的。

你如何做这样的事情(我知道的语法是wromg),在类中创建textarea和textinput有点像这样(但没有args)$this->textarea = '<textarea></textarea>';

$newform = new newform();
$newform->textarea($args);
$newform->textinput($args);
$newform->textarea($args);

我的意思是你在课堂上添加了哪些额外的函数,以便你首先声明类($newform = new newform();)然后将$ args传递给类中的项目,这样你就可以做“某事”了以上?

希望我自己解释。

4 个答案:

答案 0 :(得分:3)

如果参数数组中的参数与各个表单元素相关,请将参数移动到新函数,而不是将其传递给类构造函数。像这样:

class newform {
    public function __construct() { }
    public function make_textarea(array $args) {
        /* do stuff here */
        return $formatted_textarea; // a string like '<textarea></textarea>'
    }
    public function make_input(array $args) {
        /* do stuff here */
        return $formatted_input; // a string like '<input />'
    }
}

然后在你的模板中:

$form = new newForm;
echo $form->make_textarea(array('arg1' => 'val1', 'arg2' => 'val2'));
echo $form->make_input(array('arg1' => 'val3', 'arg2' => 'val4'));

注意:调用方法时我没有($args = array('arg1'=>。不需要将数组分配给变量。

注意:请注意数组type hintingmake_textarea(array $args)。这只是为了确保将数组传递给该方法。如果还有其他任何内容传递给该方法 - 例如一个字符串 - 将抛出致命错误。

更新 - 如何使用私有方法

class Example {
    public function do_something(array $args) {
        $result = $this->private_method($args);
        return $result;
    }
    private function private_method(array $args) {
        /* do stuff here */
        return $formatted_args;
    }
}

答案 1 :(得分:2)

为您要生成的每种类型的标记声明函数并不啰嗦。标签数量有限,而不是依靠通过__call动态拦截函数调用,最好只是定义方法。

移动每种类型标记的大部分内部实现可以移动到私有方法以生成通用HTML标记。并非所有表单元素都共享任何内部实现;像<input type="password" /><input type="text" />这样的标签显然是共享实施的候选者,而<select>元素则需要特殊处理。

以下内容应该给你一个想法。当你建立自己的时候,不要忘记在适当的地方逃避htmlspecialchars

class Form_helper {

  // pass boolean false for $contents to build a self-closing "<input />"-style tag
  private function html_tag($name, $contents, array $attributes = array() {
    $tag = "<$name";

    foreach ($attributes as $key => $value) {
      $tag .= " $key=\"$value\"";
    }

    if ($contents === false) { 
      // self-closing
      $tag .= " />"; 
    } else {
      $tag .= ">$contents</$name>";
    }

    return $tag;
  }


  public function textarea($contents, array $attributes = array()) {
    return $this->html_tag('textarea', $contents, $attributes);
  }

  public function input(array $attributes = array()) {
    return $this->html_tag('input', false, $attributes);
  }

  public function select(array $options) {
     // options contains "value"=>"contents" mappings, for production
     // option tags in the form <option value="value">contents</option>
     $option_tags = '';
     foreach ($options as $value => $content) {
       $option_tags .= $this->html_tag('option', $content, array('value' => $value));
     }

     return $this->html_tag('select', $option_tags);
  }
}

答案 2 :(得分:1)

首先,您不必这样做:

$newform = new newform($args = array('arg1'=>'arg1 val','arg2'=>'arg2 val'));

这就足够了:

$newform = new newform(array('arg1'=>'arg1 val','arg2'=>'arg2 val'));

也就是说,如果要将数组作为第一个参数传递。通常情况下,你会做这样的事情:

class newform {
   public function __construct($arg1, $arg2) {
      // method body here
   }
}

$form = new newform('arg1 val', 'arg2 val');

现在,您必须记住构造函数(__construct)就像另一种方法。所以你可以这样做:

class newform {
   public function __construct() {
      // method body here
   }

   public function textarea($name) {
       echo '<textarea name="'.$name.'"></textarea>';
   }

   public funciton textinput($name) {
       echo '<input type="text" name="'.$name.'"/>';
   }
}

$form = new newform;
$form->textarea('foo');
$form->textinput('bar');

输出:

<textarea name="foo"></textarea>
<input type="text" name="bar"/>

答案 3 :(得分:0)

我不确定你的意思,但我的胆量告诉我你所需要的是所谓的魔术方法:

magic methods / overloading / manual

最佳

拉​​斐尔