帮助分析代码执行(PHP)

帮助分析代码执行(PHP),php,associative-array,Php,Associative Array,我对php比较陌生,在理解以下代码的输出时遇到困难: function test_params($a, $b, $arrOptionalParams = array()) { $c = 'sat'; // default value for c $d = 'mat'; // default value for d foreach($arrOptionalParams as $key => $value) { ${$key} = $value;

我对php比较陌生,在理解以下代码的输出时遇到困难:

function test_params($a, $b, $arrOptionalParams = array()) {
    $c = 'sat';  // default value for c
    $d = 'mat'; // default value for d

    foreach($arrOptionalParams as $key => $value) {
        ${$key} = $value;
    }
    echo "$a $b $c on the $d";
}

test_params('The', 'dog', array('c' => 'stood', 'd' => 'donkey'));
这就产生了: 狗站在驴子上

这是我的方法,也是我通过手动执行代码所掌握的:

$a = 'The'
$b = 'dog'

arrOptionalParams['c']="stood"
arrOptionalParams['d']="donkey"

$c='sat'
$d='mat'

loop:
${$key}=value;

1st loop:
${$c}="stood"
$sat="stood"

2nd loop:
${$d}="donkey"
$mat="donkey"

echo "$a $b $c on the $d"
The dog sat on the mat
c和d的值确实会改变,我不明白为什么。任何详细的解释都将不胜感激。

您非常接近$c和d美元因以下原因发生变化

所以在循环中:

foreach($arrOptionalParams as $key => $value) {
    ${$key} = $value;
}
当$key='c'时,数组内部解析为$c=$value

因为{$key}解析为c,所以$c=$value,其中$value==来自传递给函数的数组

这个函数似乎故意混淆。更好的方法将更加明确:

function test_params($a, $b, $arrOptionalParams = array()) {
    $defaultParams = [
        'c' => 'sat',
        'd' => 'mat'    
    ];
    $params = array_merge($defaultParams, $arrOptionalParams);

    foreach($params as $key => $value) {
        $key = $value;
    }
    echo "$a $b $c on the $d";
}
请注意$$key=$value;也行。