我正在使用PHP 5.4.25。请使用以下代码:
<?php
function works($params=[])
{
var_dump(is_array($params));
var_dump($params);
$params = (array) $params;
var_dump(is_array($params));
var_dump($params);
$params['first_name'] = "Bob";
}
function fails($params=[])
{
var_dump(is_array($params));
var_dump($params);
$params['first_name'] = "Bob";
}
call_user_func_array('works', ['first_name'=>'John', 'last_name'=>'Doe']);
call_user_func_array('fails', ['first_name'=>'John', 'last_name'=>'Doe']);
结果:
bool(false)
string(4) "John"
bool(true)
array(1) {
[0] =>
string(4) "John"
}
bool(false)
string(4) "John"
PHP Warning: Illegal string offset 'name' in /vhosts/site/test.php on line 14
PHP Stack trace:
PHP 1. {main}() /vhosts/site/test.php:0
PHP 2. call_user_func_array() /vhosts/site/test.php:17
PHP 3. fails() /vhosts/site/test.php:17
看来传递的数组不是有效数组...它只显示数组的第一个值,而是显示字符串而不是数组......但是你可以将字符串转换为数组,然后它工作得很好.....
解决方案显然只是在函数的开头将其转换为数组,但看起来你不应该这样做。这是一个PHP错误吗?我似乎无法找到任何其他报告。
答案 0 :(得分:6)
这不是一个错误,call_user_func_array()
接受一个数组,并将其作为单独的参数传递给函数。
如果您有do_something($a, $b, $c)
功能,则可以执行call_user_func_array("do_something", array(1, 2, 3))
,然后拨打do_something(1, 2, 3)
。如果您只需要调用函数并将数组作为参数传递,则可以使用call_user_func
。
听起来你想要这样做:
call_user_func('works', ['first_name'=>'John', 'last_name'=>'Doe']);
如果你坚持使用call_user_func_array
,我想你可以这样做:
call_user_func_array('works', [['first_name'=>'John', 'last_name'=>'Doe']]);
传递数组数组,因此它将获取数组中的单个元素并将其作为参数传递给函数。
如果方法是动态的,另一个选择是简单地做这样的事情:
$method = "works";
$method(['first_name'=>'John', 'last_name'=>'Doe']);
答案 1 :(得分:0)
尽管最初的问题是关于PHP 5.4.25的,但是在PHP 5.6以后的版本中,可以使用三点可变长参数列表功能简化答案。
call_user_func_array('foo', ['a', 'b', 'c']);
function foo(...$params) {
// $params = ['a', 'b', 'c']
}
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list