强制func_get_args()的结果为关联数组而不是0-index

Mik*_*ell 4 php arguments

想知道是否有可能像func_get_args()(引用)那样进行调用而不是产生0索引数组,导致关联数组,使用变量名作为键?

例如:

function foo($arg1, $arg2)
{
    var_dump(func_get_args());
}

foo('bar1', 'bar2');

// Output
array(2) {
  [0]=>
  string(4) "bar1"
  [1]=>
  string(4) "bar2"
}

// Preferred
array(2) {
  [arg1]=>
  string(4) "bar1"
  [arg2]=>
  string(4) "bar2"
}
Run Code Online (Sandbox Code Playgroud)

我问的原因是,我需要验证这些args作为数组传递给RPC函数,实际上是填充的.而且似乎最好是具体内容而不是希望它们以正确的顺序传递:

// Now
if (array_key_exists(0, $args)) {

// Preferred
if (array_key_exists('arg1', $args)) {
Run Code Online (Sandbox Code Playgroud)

在传递给RPC之前,我很容易从传入原始函数的args创建一个assoc数组,但只是想知道是否有一个已编译的函数为我做这个.

谢谢.

- 编辑 -

对不起,我忘了提到我触摸的代码已经存在,这意味着我无法更改功能签名.

hak*_*kre 16

您可以在函数的最开头使用get_defined_varsDocs,使其仅包含传递(和定义)的参数:

function foo($arg1, $arg2)
{
    var_dump(get_defined_vars());
}

foo('bar1', 'bar2');
Run Code Online (Sandbox Code Playgroud)

输出(演示):

array(2) {
  ["arg1"]=>
  string(4) "bar1"
  ["arg2"]=>
  string(4) "bar2"
}
Run Code Online (Sandbox Code Playgroud)

如果您在函数内部使用静态或全局变量,请调用指定它们get_defined_vars,例如:

function foo($arg1, $arg2)
{
    $passed = get_defined_vars();

    static $staticVariable = 0;
    global $staticVariable;
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这与func_get_argsDocs不同,Docs也包含已传递但未定义的函数参数.默认参数也不是其中的一部分,func_get_args但自然get_defined_vars会使用默认值.


FtD*_*Xw6 5

您应该要求参数本身不是参数,而是一个关联数组:

public function yourMethod(array $args = array()) {
    if (array_key_exists('foo', $args)) {
        // foo
    }

    // ...
}

$obj->yourMethod(array(
    'foo' => 'foo value',
    'bar' => 'bar value'
));
Run Code Online (Sandbox Code Playgroud)