call_user_func_array()将数组作为字符串错误传递?

时间:2014-08-08 17:11:00

标签: php arrays

我正在使用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错误吗?我似乎无法找到任何其他报告。

2 个答案:

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