foreach语句后面的分号有&;interesting&;结果.为什么


Semicolon after foreach statement has "interesting" result. Why?

刚刚看了啊哈!力矩,在foreach环后意外添加;。有趣的是,这并没有抛出错误,而是跳过了循环数组中的所有内容,只触及最后一个元素。

测试代码:

$test_array = array(
    'a' => 'one',
    'b' => 'two',
    'c' => 'three'
);
foreach ( $test_array as $key => $val );
    echo $val;

问题:为什么会这样?

分号结束语句,foreach语句类似于函数——它打开一个作用域。如果不使用大括号打开多行作用域,则作用域将运行到下一个分号,因此

foreach ( $test_array as $key => $val );

相当于

foreach ( $test_array as $key => $val ) { }

我相信这回答了你的问题,为什么它会这样做

当你这样做的时候:

foreach ( $test_array as $key => $val );

这里所有的foreach都被执行(通过每个元素),但是当您放置;时,没有其他指令利用它,相反,当它结束所有迭代时,$val包含最后一个元素的值,您恰好在下一个指令中回显:

echo $val;

;结束循环,因此它相当于

foreach ( $test_array as $key => $val ){ /* do nothing */ }

在循环末尾$val有最后一个键的值,因此它回显

这是所有类c语法语言的标准"特性"。也就是说,

for (...);

for (...) { }

同样,在你的例子中,在foreach循环结束后,$val不会消失,但仍然存在,并保留最后分配给它的值。

循环运行,执行迭代和条件检查,但没有其他操作。然后执行echo命令,此时$val包含分配给它的最后一个值。最后一个赋值就是循环中最后一个值

你所做的就是循环到所有元素,但是除了最后一个元素之外什么都不做。