goto语法在PHP中的使用教程

前言

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

代码运行到 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;
}

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

b:
 echo 'b';

goto b;

代码执行到 goto 时,跳回了之前的b标签行,然后继续向下执行,又到 goto 了,成为了一个死循环。有点像 while(true) 的感觉了。但是,在这个 goto 循环里是没有 break 的,只能在 goto 出去到别的地方。

注意:goto 操作符仅在 PHP 5.3及以上版本有效。

参考:https://www.php.net/manual/zh/control-structures.goto.php

总结

到此这篇关于goto语法在PHP中使用教程的文章就介绍到这了,更多相关goto语法在PHP的使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • php5.3 goto函数介绍和示例

    goto操作符是PHP5.3+后新增功能,用来跳转到程序的另一位置:用法很简单:goto后面带上目标位置的标志,在目标位置上用目标名加冒号标记,如下: 复制代码 代码如下: goto a;echo '我们';a:    echo 'http://www.jb51.net'; 但是goto的目标位置只能同一文件和作用域[既不能跳转到一个函数和类方法中],当然它可以跳出循环,但是不能跳入循环: 复制代码 代码如下: <?phpfor($i = 0; $i < 3; $i++){    echo $

  • PHP goto语句用法实例

    问题 当 PHP 在执行代码过程,在某一时刻我们希望它能跳转到某一特定位置继续执行代码,该怎么做呢? 回答 在 PHP 中,我们可以使用 goto 操作符来使 PHP 代码执行器跳转到程序中某一特定位置.goto 的使用有一定限制,如:无法跳出一个函数或类,无法从外部跳入到一个函数,无法跳入到任何循环或者 switch 结构中.但可以跳出循环或者 switch,通常的用法是用 goto 代替 switch 中嵌套多层的 break. 语法 goto 会使 PHP 直接跳转到指定标志位置. got

  • PHP goto语句简介和使用实例

    goto操作符可以用来跳转到程序中的某一指定位置.该目标位置可以用目标名称加上冒号来标记.PHP中的goto有一定限制,只能在同一个文件和作用域中跳转,也就是说你无法跳出一个函数或类方法,也无法跳入到另一个函数.你也无法跳入到任何循环或者switch 结构中.常见的用法是用来跳出循环或者switch,可以代替多层的break. 用法很简单:goto后面带上目标位置的标志,在目标位置上用目标名加冒号标记,如下: 复制代码 代码如下: <?phpgoto a;echo 'Foo';//此句被略过 a

  • php使用goto实现自动重启swoole、reactphp、workerman服务的代码

    在平时使用swoole进行开发中,常常遇到这种问题,改了代码之后,手动ctrl+c中断服务,再敲命令重启服务.频繁地重启,感觉心很累. php提供了inotify扩展,调用linux的inotify系统调用,监控文件的变化. 这时候就产生了一个想法,我开一个主进程监控文件变化,再开一个子进程运行swoole服务.主进程监听到文件变化之后,干掉子进程,然后再开一个子进程运行swoole服务. 子进程如果想优雅地退出,安装个信号处理器,在退出之前做一些操作. <?php //index.php re

  • goto语法在PHP中的使用教程

    前言 在C++.Java及很多语言中,都存在着一个神奇的语法,就是goto.顾名思义,它的使用是直接去到某个地方.从代码的角度来说,也就是直接跳转到指定的地方.PHP中也有这个功能,我们先来看看它是如何使用的: 代码运行到 goto 位置时,就跳转到了 a: 所在的代码行并继续执行下去.这个功能对于复杂的嵌套 if 或者在一些循环中进行跳出很有用,特别是针对某些异常或者错误情况的处理,比如: for ($i = 0, $j = 50; $i < 100; $i++) { while ($j--)

  • vue.js中npm安装教程图解

    首先理清nodejs和npm的关系: node.js是javascript的一种运行环境,是对Google V8引擎进行的封装.是一个服务器端的javascript的解释器. 包含关系,nodejs中含有npm,比如说你安装好nodejs,你打开cmd输入npm -v会发现出啊线npm的版本号,说明npm已经安装好. 引用大神的总结: 其实npm是nodejs的包管理器(package manager).我们在Node.js上开发时,会用到很多别人已经写好的javascript代码,如果每当我们

  • React中props使用教程

    目录 1. children 属性 1.1 React.cloneElement方法 1.2 React.Children.map方法 2. 类型限制(prop-types) 3. 默认值(defaultProps) 1. children 属性 概述: children 属性,表示组件标签的子节点,当组件标签有子节点时,props 就会有该属性,与普通的 props 一样,其值可以是任意类型.单标签和双标签中没有数据就没有此属性. 语法: # 父组件 class App extends Rea

  • iOS中SQLite使用教程

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快.SQLite第一个Alpha版本诞生于2

  • webpack中CommonsChunkPlugin详细教程(小结)

    本文介绍了webpack中CommonsChunkPlugin详细教程(小结),分享给大家,也给自己留个笔记,具体如下: 1.demo结构: 2.package.json配置: { "name": "webpack-simple-demo", "version": "1.0.0", "description": "", "main": "index.js&q

  • bmob js-sdk 在vue中的使用教程

    BmobSDK的引入 将bmob js-sdk放在static目录,然后在index.html页面中已 script 标签的形式引入,就可以在vue中全局使用bmob js-sdk <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="static/bmob-min.js">

  • Redis在springboot中的使用教程

    依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 配置文件如下: spring: redis: open: true # 是否开启redis缓存 true开启 false关闭 database: 0 host: 47.10

  • websocket在springboot+vue中的使用教程

    1.websocket在springboot中的一种实现 在java后台中,websocket是作为一种服务端配置,其配置如下 @Configuration public class WebSocketConfig { @Bean(name="serverEndpointExporter") public ServerEndpointExporter getServerEndpointExporterBean(){ return new ServerEndpointExporter()

  • animate.css在vue项目中的使用教程

    在vue项目中使用动画其实有多种方式,可以使用vue中的过渡transition,可以使用animate动画与transition配合使用,也可以单独使用animate动画库(详情可见vue官网-过渡:过渡),下面我们开始介绍在vue中单独使用animate动画,其实也非常简单,两步留可以实现: 第一步:安装: 在命令行中执行:npm install animate.css --save 第二步:引入及使用: main.js中: import animated from 'animate.css

  • 在Python IDLE 下调用anaconda中的库教程

    大家都知道,Anaconda是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.下载了anaconda我们可以很方便的随时调用这里面的库. 原先我自己在Python官网下载了python 3.7开发环境,anaconda的后面下载的,平时比较喜欢使用 IDLE 作简单的程序或学习的时候,发现调用不了anaconda中的库,就算是在cmd程序中使用pip 下载相应的库时,最终的库路径也是存于anaconda的库路径中. 当然,通过相关命令实现pip下载路

随机推荐