gotoa;echo"1";//不会输出a:echo'2';//2
代码运行到goto位置时,就跳转到了a:所在的代码行并连续实行下去。觉得很好玩吧,这个功能对付繁芜的嵌套if或者在一些循环中进行跳出很有用,特殊是针对某些非常或者缺点情形的处理,比如:
for($i=0,$j=50;$i<100;$i++){while($j--){if($j==17){//假设$j==17是一种非常情形gotoend;//直接跳走了,循环结束的结果也不输出了}}}echo"i=$i";end:echo'jhit17';//直接到这里输出或者处理非常情形了
觉得还不错是吧,不过goto语法也有一些限定情形:
目标位置只能位于同一个文件和浸染域,也便是说无法跳出一个函数或类方法,也无法跳入到另一个函数无法跳入到任何循环或者 switch 构造中跳出循环或者 switch,常日的用法是用 goto 代替多层的 break比如以下的代码都是无效的:
$a=1;gotoswitchgo;switch($a){case1:echo'bb';break;case2:echo'cc';switchgo:echo"bb";break;}gotowhilego;while($a<10){$a++;whilego:echo$a;}//Fatalerror:'goto'toundefinedlabel'ifgo'
它们都会报同样的缺点,由于浸染域的关系无法找到定义的goto标签。其余还须要把稳的,利用goto可能什么引起去世循环,如下所示:
b:echo'b';gotob;
代码实行到goto时,跳回了之前的b标签行,然后连续向下实行,又到goto了,成为了一个去世循环。有点像while(true)的觉得了。但是,在这个goto循环里是没有break的,只能在goto出去到别的地方。
以是,goto这个语法的利用非常少,由于它会扰乱你的代码逻辑流程,但喜好它的人又会觉得到可以让代码非常地灵巧多变。这就要仁者见仁智者见智的进行选择了,目前大多数措辞的文档中都并不是很提倡利用这个语法,包括PHP。我的建议是,如果不是非常分外的情形或者是为了炫技,只管即便不要利用goto语法,当项目代码繁芜起来后,很随意马虎让别人或者自己看懵。
测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/goto%E8%AF%AD%E6%B3%95%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.md
参考文档:https://www.php.net/manual/zh/control-structures.goto.php