如何在php中动态调用函数的对象链?

时间:2017-09-25 12:23:04

标签: php arrays

$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中这样做)

1 个答案:

答案 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);

此功能在功能上等同于链接您的功能。

请注意一些警告。

  1. 上述函数假定$config中包含的所有方法都返回$this。如果您愿意,可以添加一些验证逻辑来​​解释没有的方法。
  2. 此函数可让您调用Form中的任何公共方法,在执行函数之前,您可能需要添加一些逻辑来验证$config