在func_get_args()中使用变量名

时间:2014-08-23 10:40:50

标签: php arrays function parameters arguments

由于此功能可以使用未知数量的参数:

function BulkParam(){
    return func_get_args();
}

print_r只打印值,但我如何检索变量名和数组键?例如:

$d1 = "test data";
$d2 = "test data";
$d3 = "test data";

print_r(BulkParam($d1, $d2, $d3));

它会打印出来:

Array
(
    [0] => test data
    [1] => test data
    [2] => test data
)

但是我希望将变量名称作为所有数组的索引名称或键名。然后数组看起来像这样:

Array
(
    [d1] => test data
    [d2] => test data
    [d3] => test data
)

2 个答案:

答案 0 :(得分:1)

你做不到。变量名称不会传递给函数。变量是特定算法本地的占位符,它们不是数据,它们在另一个范围内没有意义,并且不会被传递。如果需要键值对,则传递显式命名的关联数组:

bulkParam(['d1' => $d1, 'd2' => $d2, ...]);

这是shortcut

bulkParam(compact('d1', 'd2'));

然后使用数组:

function bulkParam(array $params) {
    foreach ($params as $key => $value) ...
}

正如Mark在评论中提到的那样,有时你甚至没有变量:

bulkParam('foo');
bulkParam(foo(bar(baz())));

现在是什么?

或者最终你想要重构代码并更改变量名称:

// old
$d1 = 'd1';
bulkParam($d1);

// new
$userName = 'd1';
bulkParam($userName);

您的应用程序行为不应仅仅因为重命名变量而改变。

答案 1 :(得分:1)

我确定PHP精英会遇到很多这个问题的问题,但它确实有效(我使用的是PHP 5.6)老实说我不在乎,因为我已经完成了在我的许多Java项目中,为了进行原型设计而进行的攻击远不如此。

function args_with_keys( array $args, $class = null, $method = null, $includeOptional = false )
{
    if ( is_null( $class ) || is_null( $method ) )
    {
        $trace = debug_backtrace()[1];

        $class = $trace['class'];
        $method = $trace['function'];
    }

    $reflection = new \ReflectionMethod( $class, $method );

    if ( count( $args ) < $reflection->getNumberOfRequiredParameters() )
        throw new \RuntimeException( "Something went wrong! We had less than the required number of parameters." );

    foreach ( $reflection->getParameters() as $param )
    {
        if ( isset( $args[$param->getPosition()] ) )
        {
            $args[$param->getName()] = $args[$param->getPosition()];
            unset( $args[$param->getPosition()] );
        }
        else if ( $includeOptional && $param->isOptional() )
        {
            $args[$param->getName()] = $param->getDefaultValue();
        }
    }

    return $args;
}

使用PHP Reflections API,我们获取所有方法参数并将它们与数字索引对齐。 (可能有更好的方法。)

只需输入:

即可
print_r( args_with_keys( func_get_args() ) );

我还添加了可选地返回方法的可选参数和值的功能。我确信这个解决方案远非完美,因此您的里程可能会有所不同。请记住,虽然我确实提供了类,因此提供类和方法是可选的,但我强烈建议您指定它们,如果您在生产环境附近的任何地方。除了原型设置之外,你应该尽量避免使用它。

使用以下命令指定类和方法:

print_r( args_with_keys( func_get_args(), __CLASS__, __FUNCTION__ ) );