PHP将所有函数参数获取为$key=>$值数组?

PHP将所有函数参数获取为$key=>$值数组?,php,Php,但是,我希望结果数组为$key=>$value形式,$key表示参数名 PHP不支持任意数量的命名参数。您可以在函数声明中决定固定数量的参数及其名称,也可以只获取值 通常的解决方法是使用数组: <?php function register_template(){ print_r(func_get_args()); # the result was an array ( [0] => my template [1] => screenshot.png [2] =

但是,我希望结果数组为$key=>$value形式,$key表示参数名

PHP不支持任意数量的命名参数。您可以在函数声明中决定固定数量的参数及其名称,也可以只获取值

通常的解决方法是使用数组:

<?php
function register_template(){
    print_r(func_get_args());
    # the result was an array ( [0] => my template [1] => screenshot.png [2] => nice template .. ) 

}

register_template(     # unkown number of arguments
    $name = "my template",
    $screenshot = "screenshot.png",
    $description = "nice template .. "
)
?>
使用以下命令:

function register_template($args) {
    // use $args
}

register_template(array('name' => 'my template', ...));
foreach(func\u get\u args()作为$k=>v)
回音$k。" => " . $v“
”;
这很简单。只需将数组作为参数传递,然后在函数中作为
$key=>$value
访问它

更新 这是我能想到的最好的了

foreach(func_get_args() as $k => $v)
    echo $k . " => " . $v . "<BR/>";

我还没有测试过…顺便说一句。但是您应该得到一点

没有参数名这样的东西
Frobnite($a=“b”)
不是一个带有参数语法的调用,它只是一个赋值,然后是一个函数调用——这是一个用于代码文档的技巧,语言实际上没有考虑到


人们通常接受以如下形式提供参数的关联数组:
frobnite(数组('a'=>'b'))

您不能,参数只是位置变量。也许你可以发送一个数组

$vars = array("var1","var2"); //define the variable one extra time here
$$vars[0] = 'value1'; // or use $var1
$$vars[1] = 'value2'; // or use $var2

function myfunction() {
    global $vars;
    $fVars = func_get_args();
    foreach($fVars as $key=>$value) {
       $fvars[$vars[$key]] = $value;
       unset($fvar[$key]);
    }
    //now you have what you want var1=> value1
}

myfunction(array($$vars[0],$$vars[1]));

使用

备选方案A)


备选方案B)


想做同样的事情,但对已经给出的答案并不完全满意

尝试将其添加到您的函数->

<?php

function registerTemplateC($args) {
    // you now have an associative array in $args
    print_r($args);
}

registerTemplateC(array('name' => 'my template', 'screenshot' => 'screenshot.png', 'description' => 'nice template'));

?>

我还没有考虑过让它成为您自己的函数,您可以直接调用它,但可能能够…

将函数参数设置为MAP NAME=>VALUE

$reflector = new ReflectionClass(__CLASS__);
$parameters = $reflector->getMethod(__FUNCTION__)->getParameters();

$args = array();
foreach($parameters as $parameter)
{
    $args[$parameter->name] = ${$parameter->name};
}
print_r($args);
让我们测试一下

class MyAwesomeClass
{
    public static function apple($kind, $weight, $color = 'green')
    {
        $args = self::funcGetNamedParams();
        print_r($args);
    }

    private static function funcGetNamedParams() {
        $func = debug_backtrace()[1]['function'];
        $args = debug_backtrace()[1]['args'];
        $reflector = new \ReflectionClass(__CLASS__);
        $params = [];
        foreach($reflector->getMethod($func)->getParameters() as $k => $parameter){
            $params[$parameter->name] = isset($args[$k]) ? $args[$k] : $parameter->getDefaultValue();
        }

        return $params;
    }
}
输出:

MyAwesomeClass::apple('Granny Smith', 250);

您可以通过get_defined_vars()执行此操作,但不应忘记此函数返回函数范围内的每个变量

例如:

Array
(
    [kind] => Granny Smith
    [weight] => 250
    [color] => green
)


为什么不将数组作为
register\u template
参数传递?(相关)-1:这将输出
0=>my template
,而不是预期的
name=>my template
。OP调用函数的方式实际上是错误的;你无法访问被调用函数中的键(
name
screenshot
等),除非他将参数作为关联数组传递<因此,如果函数的调用方式正确,则code>func\u get\u args
是正确的方法。@Salman如果将关联数组传递到函数中,上述代码将只产生一个键和一个值:
$k=0,$v=array(…)
,在这种情况下,
unknown number of arguments
子句不再有意义,而是迭代相关数组,而不是
func\u get\u args()
必须是数组我不需要使用数组作为输入,我看不到除此之外的任何简单方法很多糟糕的做法毫无益处。:)@deceze,是的。。。我知道我的解决方案非常混乱……但这正是OP想要的,这就是我给ha haI的,不需要使用数组作为input@web你需要为你想要完成的事情付出代价。。。我想听听你对我的答案的评论。@Starx这一做法一点也不坏。那么,使用这种方法,你将如何访问参数呢。你能做一些像echo$args['name']这样的事情吗?或者你必须使用func_get_args之类的工具吗?这是完美的,非常感谢。设法把它压缩成5行砖一样的代码,我现在可以在任何我喜欢的地方使用。虽然不是最漂亮的解决方案,但它提供了并且非常健壮。请记住,反射的使用非常缓慢,不建议在production+1中使用正确的方法来操作具有可变参数的函数。这是正确的方法。有关更多信息,请参见。这是一个非常酷的解决方案。除了反射速度慢之外,有人知道使用这种方法有什么缺点吗?
$reflector = new ReflectionClass(__CLASS__);
$parameters = $reflector->getMethod(__FUNCTION__)->getParameters();

$args = array();
foreach($parameters as $parameter)
{
    $args[$parameter->name] = ${$parameter->name};
}
print_r($args);
function test($a,$b,$c){

  // result map   nameParam=>value
  $inMapParameters=[];

   //get values of parameters
  $fnValueParameters=func_get_args();

  $method = new \ReflectionMethod($this, 'test');


      foreach ($method->getParameters() as $index=>$param) {

            $name = $param->getName();

            if($fnValueParameters[$index]==null){continue;}

            $inMapParameters["$name"]=$fnValueParameters[$index];
        }

}
class MyAwesomeClass
{
    public static function apple($kind, $weight, $color = 'green')
    {
        $args = self::funcGetNamedParams();
        print_r($args);
    }

    private static function funcGetNamedParams() {
        $func = debug_backtrace()[1]['function'];
        $args = debug_backtrace()[1]['args'];
        $reflector = new \ReflectionClass(__CLASS__);
        $params = [];
        foreach($reflector->getMethod($func)->getParameters() as $k => $parameter){
            $params[$parameter->name] = isset($args[$k]) ? $args[$k] : $parameter->getDefaultValue();
        }

        return $params;
    }
}
MyAwesomeClass::apple('Granny Smith', 250);
Array
(
    [kind] => Granny Smith
    [weight] => 250
    [color] => green
)
<?php

function asd($q, $w, $rer){
    $test = '23ew';
    var_dump(get_defined_vars());
}

asd("qweqwe", 'ewrq', '43ewdsa');
?>
array(4) {
  ["q"]=>
  string(6) "qweqwe"
  ["w"]=>
  string(4) "ewrq"
  ["rer"]=>
  string(7) "43ewdsa"
  ["test"]=>
  string(4) "23ew"
}