$form = new Form();
return $form->addHiddenElement('somename', 'value')
->addTextInputElement('someothername', 'value')
->generate();
我们有一个简单的表单生成器,有点像上面那样。
是否可以通过配置完成此操作,例如简单的php数组?
我知道:http://php.net/manual/en/function.call-user-func-array.php和其他类似的功能。但是在上面我们有一个未知数量的函数,每个函数都有一个未知的params数量,每个函数必须链接到下一个......
此数组可能正确映射..
return [
'addHiddenElement' => [
'somename', 'value'
],
'addTextInputElement' => [
'someothername', 'value'
]
]
这可能在PHP吗?
(在javascript中这可以用邪恶的eval完成;)但我知道可能有一个正确的方法在php中这样做)
答案 0 :(得分:2)
是的,您可以通过在每个函数中返回$this
来在vanilla(无论某种框架)PHP中执行此操作。考虑这个课程
class Form{
public function addHiddenElement($name, $value)
{
/**Do some stuff**/
return $this; //This will allow you to chain additional functions
}
public function addTextInputElement($name, $value)
{
/** Do some more stuff */
return $this;
}
}
通过这种方式,由于您总是返回$this
,因此您可以将该类中的其他方法链接在一起(例如$form->addHiddenElement('name','value')->addTextInputElement('name','value');
由于您总是返回$this
,因此应使用exceptions进行错误处理。
编辑:要使用配置生成功能列表,您可以使用这样的简单函数:
function buildForm($config)
{
$form = new Form(); //Create the form object
foreach($config as $function=>$params){ //iterate over the requested functions
if(method_exists($form, $function){ //Confirm the function exists before attemting execution
/** Updating $form to the result of the function call is equivalent to chaining all the functions in the $config array */
$form = call_user_func_array( array($form, $function), $params);
}
}
return $form;
}
然后您将调用此函数:
$config = [
'addHiddenElement' => [
'somename', 'value'
],
'addTextInputElement' => [
'someothername', 'value'
]
];
$form = buildForm($config);
此功能在功能上等同于链接您的功能。
请注意一些警告。
$config
中包含的所有方法都返回$this
。如果您愿意,可以添加一些验证逻辑来解释没有的方法。Form
中的任何公共方法,在执行函数之前,您可能需要添加一些逻辑来验证$config
。