goto语法在PHP中的使用

鲁馗
• 阅读 1431

在C++、Java及很多语言中,都存在着一个神奇的语法,就是goto。顾名思义,它的使用是直接去到某个地方。从来代码的角度来说,也就是直接跳转到指定的地方。我们的PHP中也有这个功能,我们先来看看它是如何使用的:

goto a;
echo "1"; // 不会输出

a:
echo '2'; // 2

代码运行到goto位置时,就跳转到了a:所在的代码行并继续执行下去。感觉很好玩吧,这个功能对于复杂的嵌套if或者在一些循环中进行跳出很有用,特别是针对某些异常或者错误情况的处理,比如:

for ($i = 0, $j = 50; $i < 100; $i++) {
    while ($j--) {
        if ($j == 17) { // 假设$j==17是一种异常情况
            goto end; // 直接跳走了,循环结束的结果也不输出了
        }

    }
}
echo "i = $i";
end:
echo 'j hit 17'; // 直接到这里输出或者处理异常情况了

感觉还不错是吧,不过goto语法也有一些限制情况:

  • 目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数
  • 无法跳入到任何循环或者 switch 结构中
  • 跳出循环或者 switch,通常的用法是用 goto 代替多层的 break

比如以下的代码都是无效的:

$a = 1;
goto switchgo;
switch ($a){
    case 1:
        echo 'bb';
    break;
    case 2:
        echo 'cc';
        switchgo:
            echo "bb";
    break;
}

goto whilego;
while($a < 10){
    $a++;
    whilego:
        echo $a;
}


// Fatal error: 'goto' to undefined label 'ifgo' 

它们都会报同样的错误,因为作用域的关系无法找到定义的goto标签。另外还需要注意的,使用goto可能引起死循环,如下所示:

b:
    echo 'b';

goto b;

代码执行到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

各自媒体平台均可搜索【硬核项目经理】

点赞
收藏
评论区
推荐文章
冴羽 冴羽
3年前
VuePress 博客优化之拓展 Markdown 语法
前言在中,我们使用VuePress搭建了一个博客,最终的效果查看:。如果我们浏览过TypeScript,我们会发现一个很好用的功能,那就是很多代码块,在悬浮上去的时候都会出现一个Try按钮:点击就会跳转到对应的Playground,比如图示的按钮跳转的就是,我们可以在这个Playground修改并验证代码效果。如果我们要实现这样的功能,该
Wesley13 Wesley13
3年前
java基础常见面试题,这是一篇超长的随笔!!!
1\.Java基础部分.......................................................41、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?..42、Java有没有goto?.................................................4
Souleigh ✨ Souleigh ✨
4年前
PHP 8 有哪些值得期待的新特性
新的PHP主要版本PHP8预计将于2020年底发布。它现在正处于非常活跃的开发中,所以在接下来的几个月里,开发速度和开发进程可能会有很大的变化。在这篇文章中,我会罗列出PHP8中会发生的一些改变:新功能、性能改进和突破性变化。因为PHP8是一个新的主要版本,所以代码及语法向下兼容性会更低。如果您一直保持与最新版本保持同步,
Dax Dax
4年前
如何使用vue中的nextTick
其实这个问题主要就是针对Vue的异步更新队列的理解,因为我们平时用的也比较少,所以很多时候都会忽略掉,但是如果我们在面试当中能比较详细的解答这个问题,那么我相信这应该会是一个闪光点,那话不多说,我们先来捋一下答题思路:答题思路:nextTick是什么?先来一个定义为什么需要他呢?异步更新队列实现原理解释什么地方使用到他呢?描述使用的场景如何使用他呢?描述使用
Wesley13 Wesley13
3年前
ubuntu卸载php7并安装php5.6记录
      ubuntu16.04版本从默认源安装的php版本为7.x版本,我们都知道php7.0已经舍弃了很多旧版本的函数等内容,这对旧系统来说是致命的,那么,我们就有了安装旧版php的需求,而同一主机安装两个版本的php,如果不做配置会报错。那么,我们就需要:一、卸载php7.x;1)如果我们知道在安装php7的时候都安装了那些包及扩
Wesley13 Wesley13
3年前
PHP代码优化的一些重要技巧
除了要学习PHP的基本知识,比如《为开发者准备的9个实用PHP代码片段》《深入探讨PHP类的封装与继承》《PHP比较运算符的详细学习》,还要了解一些代码优化上的技巧,从而帮助我们写出更加优秀的程序。我们在编写程序时,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少。PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法,它可以
Stella981 Stella981
3年前
PHP中unset,array_splice删除数组中元素的区别
php(https://www.oschina.net/p/php)中删除数组元素是非常的简单的,但有时删除数组需要对索引进行一些排序要求我们会使用到相关的函数,这里我们来介绍使用unset,array\_splice删除数组中的元素区别吧如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排:?(https://ww
Stella981 Stella981
3年前
NO.13 禅道项目管理软件ZenTaoPHP框架系统要求
禅道项目管理软件ZT框架使用了php5所特有的语法、类、函数,因此php4是无法运行ZT框架的。使用ZT,你需要:1\.webserver最好是apache。因为它和php集成使用是最稳定,功能也是最齐全的一套组合。2\.php最好是5.2以后的版本,最少是5.1系列的版本。3\.数据库最好是mysql4以后的
Wesley13 Wesley13
3年前
PHP匿名函数及闭包
匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了,目前使用比较广泛的Javascript以及C,PHP直到5.3才开始真正支持匿名函数,C的新标准C0x也开始支持了。匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数,最常见应用是作为回调函数
Wesley13 Wesley13
3年前
vim之syntastic插件使用和配置
1.syntastic的安装步骤很简单,网上也很多,这里不再赘述;2.如果使用c11及以上的语法标准,如auto等,syntastic会非常友好的给出一个提醒,这个提醒和编译时,没有指定stdc11的提醒一样,这个时候需要指定syntastic编译时,指定的编译选项,可通过修改.vimrc完成,也可修改syntastic的对C的语
小万哥 小万哥
1年前
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C多级继承多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。多级继承的语法在C中,使用:符号来指定继承关系。多级继承的语法如下:cclassDerivedClass:publ
鲁馗
鲁馗
Lv1
正是江南好风景,落花时节又逢君。
文章
3
粉丝
0
获赞
0