【问题标题】:How to use a PHP associative array as function call arguments?如何使用 PHP 关联数组作为函数调用参数?
【发布时间】:2020-12-27 02:36:40
【问题描述】:

假设有一个带有一些参数的函数,并且我有一个关联数组(或具有公共属性的简单对象 - 这几乎相同,因为我总是可以使用类型转换 (object)$array),其键对应于函数参数名称,其值对应于函数调用参数。我如何调用它并将它们传递到那里?

<?php
function f($b, $a) { echo "$a$b"; }
// notice that the order of args may differ.
$args = ['a' => 1, 'b' => 2];
call_user_func_array('f', $args); // expected output: 12 ; actual output: 21
f($args); // expected output: 12 ; actual output: ↓
// Fatal error: Uncaught ArgumentCountError:
// Too few arguments to function f(), 1 passed

【问题讨论】:

  • 你应该展示你正在尝试做的代码示例
  • @JohnConde 我很乐意,但问题是我不知道如何在 php 中做到这一点 ????。我已经添加了一个示例 - 虽然不工作

标签: php parameter-passing associative-array function-call


【解决方案1】:

事实证明,我只需要使用 PHP 8 (https://wiki.php.net/rfc/named_params#variadic_functions_and_argument_unpacking) 中引入的名为参数解包功能的可变参数函数:

f(...$args); // output: 12

在 PHP 8 之前,此代码会产生错误:Cannot unpack array with string keys

其次,事实证明call_user_func_array 在 PHP 8 中也可以正常工作(请参阅 https://wiki.php.net/rfc/named_params#call_user_func_and_friends 以获得解释):

call_user_func_array('f', $args); // output: 12

- 虽然它在旧版本中仍然输出不正确的“21”。

【讨论】:

    【解决方案2】:

    作为旧版本 PHP 的 hack,您还可以使用反射:

    <?php
    function test($b, $a) {
      echo "$a$b";
    }
    
    $callback = 'test';
    
    $parameters = ['a' => 1, 'b' => 2];
    
    $reflection = new ReflectionFunction($callback);
    $new_parameters = array();
    
    foreach ($reflection->getParameters() as $parameter) {
      $new_parameters[] = $parameters[$parameter->name];
    }
    
    $parameters = $new_parameters;
    
    call_user_func_array($callback, $parameters);
    

    Demo

    【讨论】:

    • 是的,我也想过这个,但是对于看似如此简单的事情来说,它看起来有点过于复杂。但对于较旧的 php 版本,它可能是唯一可行的解​​决方案。但我认为这太多了,也许是一个迹象,表明一个人根本不应该使用传递参数作为 assoc.array 而不是将它与反射一起使用,imo
    • 这就是为什么我注意到As a hack。我也不喜欢这个解决方案。但是很奇怪,直到现在还不可能为call_user_func使用关联数组
    猜你喜欢
    • 2010-11-03
    • 2013-03-31
    • 2010-09-18
    • 2023-03-08
    • 2010-11-28
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多