【问题标题】:Having the variable names in func_get_args()在 func_get_args() 中有变量名
【发布时间】:2014-08-23 10:40:49
【问题描述】:

因为这个函数可以接受未知数量的参数:

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
)

【问题讨论】:

  • 在调用函数/方法时,您无法轻松检索使用的变量名,并且没有业务逻辑原因需要您
  • 使用 debug_backtrace() 将允许您获取该信息,但这纯粹是一种调试帮助,而不是在工作代码中使用的工具
  • 你对print_r(BulkParam('test data 1', 'test data 2', 'test data 3'));有什么期望

标签: php arrays function parameters arguments


【解决方案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 反射 API,我们获取所有方法参数并将它们与它们的数字索引对齐。 (可能有更好的方法来做到这一点。)

要使用,只需键入:

print_r( args_with_keys( func_get_args() ) );

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

指定类和方法:

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

【讨论】:

    【解决方案2】:

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

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

    shortcut 是:

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

    然后使用数组:

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

    正如 Mark 在 cmets 中提到的,有时您甚至一开始就没有变量:

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

    现在呢?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2012-02-11
      • 2016-02-25
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多