我有一个类,其方法采用不同的参数。我得到了一个带有方法的数组,也有不同的参数。
我需要使用适当数量的参数调用方法才能工作。如果数组中的键没有值,则应始终将$input
作为第一个参数传递。
有谁知道我做错了什么或者需要做些什么来实现它?
$arr = ['trim', 'between' => [6, 254]];
我尝试失败
foreach ($arr as $method) {
if (count($method) === 0) {
$this->$method($input);
} elseif (count($method) === 1) {
$this->$method($input, $method[0]);
} elseif (count($method) === 2) {
$this->$method($input, $method[0], $method[1]);
}
}
错误
Fatal error: Method name must be a string in (..) on line N
方法
private function trim($input) //1 param
{
$this->input = trim($input);
}
private function max($input, $max) //2 params
{
if (!(strlen($input) <= $max)) {
$this->errors[] = __FUNCTION__;
}
}
private function between($input, $min, $max) //3 param
{
if (!(strlen($input) > $min && strlen($this->input) < $max)) {
$this->errors[] = __FUNCTION__;
}
}
答案 0 :(得分:2)
您可以使用call_user_func_array
的可变数量的参数轻松地动态调用您想要的任何方法。只需要处理一些细节。
首先,$arr
的格式很方便,但不一致。有时方法名称是值(例如trim
),有时它是键(例如between
)。你需要规范化事物:
foreach ($arr as $key => $value) {
if (is_int($key)) { // $key => 'trim'
$method = $value;
$arguments = [$input];
}
else { // 'trim' => [...]
$method = $key;
$arguments = array_merge([$input], is_array($value) ? $value : [$value]);
}
既然你$method
和$arguments
干净利落,那么最后一步是微不足道的:
call_user_func_array([$this, $method], $arguments);
答案 1 :(得分:0)
了解错误 $ arr = [0 =&gt; 'trim','between'=&gt; [6,254]];
你迭代值所以在$ method中得到1)'trim',2)[6,254](不是'介于'之间)