帮助分析代码执行(PHP)

时间:2018-02-07 21:26:55

标签: 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;
    }
    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的值确实发生了变化,我无法理解为什么。任何详细的解释将不胜感激。

1 个答案:

答案 0 :(得分:1)

你非常接近。由于variable variables$c$d发生了变化。

所以在循环中:

foreach($arrOptionalParams as $key => $value) {
    ${$key} = $value;
}

$key == 'c'数组内部解析为$c = $value;

因为{$key}解析为c然后$c = $value,其中$value == stood从数组传递给函数

这个功能似乎有目的地令人困惑。更好的方法更明确:

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";
}