在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

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

goto语法在PHP中的使用的更多相关文章

  1. goto 语法在 PHP 中的使用

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

  2. Exit 与 Goto :eof 在批处理中的区别【转】

    在 CMD 命令提示符窗口直接运行: 1.) 运行 Goto :eof 后,CMD 返回并将等待下一命令. 2.) 运行 Exit 后,CMD 将直接关闭并返回到曾启动 Cmd.exe 的程序或返回到 ...

  3. XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章

    XPath语法 在C#中使用XPath示例   XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml ve ...

  4. angluarjs中页面初始化的时候会出现语法{{}}在页面中问题

    angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题.出现这个的原因是:由于页面或者组件需要渲染加载数据,浏览器和angluarjs渲染页面需要消耗一定的时间,虽然这 ...

  5. Delphi的goto语法

    今天第一次主要到Delphi也有goto语法,特别是其奇怪的label声明.估计主要是用来跳出多重循环,而且还真有人使用这种方式.记个笔记: procedure TForm1.btn3Click(Se ...

  6. SystemVerilog基本语法总结(中)

    Systemverilog 语法总结(中) 上一个博客分享了SV基本的概念,这一博客继续分享,等下一个博客分享一个公司的验证的笔试题目. l 事件 背景: Verilog中当一个线程在一个事件上发生阻 ...

  7. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

  8. PHP流程控制之goto语法

    自 PHP 5.3.0 起,还可以使用 goto 来跳出循环. 在本章开始的章节,我们讲解到一个故事,王同学每周往返,但有一个特例:直线电机滑台 项目失败后或者集团临时除知除外,他就可以不再这么每周往 ...

  9. [C++][语言语法]标准C++中的string类的用法总结

    转自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 要想使用标准C++中string类,必须要包含 #include ...

随机推荐

  1. 页面模型 PageModel

    Razor页面中的程序处理方法 OnGet 和 OnGetAsync是同样的处理程序,因此不能共存,否则会报错. 视图数据 ViewData 视图数据是从页面模型向内容页面传递数据的容器.视图数据是以 ...

  2. redis缓存穿透,缓存击穿,缓存雪崩

    缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有.这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询).这样请求就会绕过 ...

  3. 查看linux系统是物理机还是虚拟机

    物理机,返回机器型号 [root@laocalhost ~]# dmidecode -s system-product-name S910-X31E 虚拟机 [root@dev01-188 ~]# d ...

  4. C# 线程安全的集合

    参考网址: https://docs.microsoft.com/en-us/dotnet/standard/collections/thread-safe/ Thread-Safe Collecti ...

  5. C#:[StructLayout(LayoutKind.Sequential)]

    参考网址: https://blog.csdn.net/hongkonglife/article/details/23422857 结构体是由若干成员组成的.布局有两种1.Sequential,顺序布 ...

  6. 【java文件处理】java项目路径下的文件下载处理

    1. controller类: package com.neo.controller; import javax.servlet.http.HttpServletResponse; import or ...

  7. Spring详解(十)加载配置文件

    在项目中有些参数经常需要修改,或者后期可能会有改动时,那我们最好把这些参数放到properties文件中,在源代码中读取properties里面的配置,这样后期只需要改动properties文件即可, ...

  8. apche的BeanUtils避免使用!

    原文出处 建议,不要使用apache的BeanUtils进行属性拷贝了,建议使用Spring 核心包bean下面的BeanUtils进行替代! 使用和对比出处

  9. BeanUtils中的自动类型转换(二)

    javabean package entity; import java.util.Date; /** * 一个测试用: * student,javaBean * @author mzy * 一个标准 ...

  10. Linux基础——安装以及常用命令

    Linux基础--常用命令 1.安装Vmware 进入VMware官网:  https://www.vmware.com/cn.html下载安装 镜像推荐网址下载:https://www.linux. ...