PHP 确实改变了循环的范围并在包含的文件中切换

Posted

技术标签:

【中文标题】PHP 确实改变了循环的范围并在包含的文件中切换【英文标题】:PHP does scope change for loops and switch in included files 【发布时间】:2019-11-16 08:08:14 【问题描述】:

如果在一个 for 循环中,有一个包含文件,并且在该包含文件中,还有另一个 for 循环,则 continue 2 不起作用

这是设计使然吗?或者这是一个错误?我完全不知所措

以下信息

文件 temp_outer_loop.php 的内容

<pre>
    <?php

    for ($z=0; $z < 20 ; $z++)  
        echo "\r\nlooping z $z of 20";

        for ($a=0; $a < 20 ; $a++)  
            echo "\r\n\tlooping a $a of 20";
            if ($a==10) continue 2;
        

    

    echo "<hr>";


    for ($x=0; $x < 20 ; $x++)  
        echo "\r\nlooping x $x of 20";

        include_once(__DIR__ . "/temp_inner_loop.php");
    




?>

文件 temp_inner_loop.php 的内容

<?php

    for ($y=0; $y < 20 ; $y++)  
        echo "\r\n\tlooping y $y of 20";

        if ($y==5) continue 2; 

    

?>

【问题讨论】:

我不确定的一件事是它使 temp_inner_loop.php 非常具体,只有将它包含在循环中才能适应。这限制了使其成为包含文件恕我直言的意义。 什么是continue 2 @vivek_23 "continue 接受一个可选的数字参数,告诉它应该跳到多少层封闭循环的末尾。默认值为 1,因此跳到当前循环的末尾。 " @FrankerZ 谢谢。很高兴知道。看起来 PHP 提供了这种特权,并且并非在每种语言中都存在。 当我尝试时,我遇到了一个致命错误。所以自然它有一个单独的执行上下文。您可以删除continue 2 语句并查看它的打印效果。 【参考方案1】:

我不认为这是一个错误。请参阅错误跟踪器上的this post back in 2006。它指出:

PHP 中的“include”不是 C 中的“#include”。它不只是复制和粘贴您的代码。包含的文件有一个单独的执行上下文,即使它确实继承了一些东西,最值得注意的是来自包含范围的符号表。您还会注意到在包含的文件中写入“return”作为文件的返回,而不是可能包含在其中的函数。

这种跨文件的 goto 绝对不适合。

【讨论】:

谢谢@FrakerZ。我认为包含与“跨文件转到”一样好。

以上是关于PHP 确实改变了循环的范围并在包含的文件中切换的主要内容,如果未能解决你的问题,请参考以下文章

如果在循环中包含PHP中的文件,它每次在循环中运行时都会访问该文件吗?

PHP - 包含文件而不继承变量?

为啥在循环中更改此标签的 ForeColor 不会明显改变?

给 PHP 包含()的文件父变量范围

什么改变了循环中的条件:while (mysql_fetch_array($var))?

PHP - 在while循环中分配值并在循环外单独访问它们