日志

goto 语法在 PHP 中的使用

 来源    2020-09-16    0  

在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;
}

它们都会报同样的错误,因为作用域的关系无法找到定义的 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

相关文章
SyntaxError:语法在python中无效,但无法找到原因
问答我今年12岁,参与我的科学展览项目.每天都有1000个包裹被盗,所以对于我的科学展览项目,我正在建造一个人们门廊上的东西.它检测到一个包裹,当包裹在没有验证的情况下被取下时,它会发出非常大的哔声并拍下 ...
1
如何使用查询语法在Lucene中搜索多个字段?
问答我正在搜索lucene索引,我正在构建搜索查询 field1:"hello" AND field2:"world" 但我想搜索任何字段中的值以及同一查询中特定字 ...
2
语法在Haskell中$$意味着什么?
问答"呃,"你可能会想--"另一个语法问题,这里让我google为你做的.可惜!我已经google了,我还是被骗了! 在yesod博客中找到这段代码 import Syste ...
1
php – 如何使用点语法遍历laravel中的模型关系
问答我试图遍历复杂的雄辩模型关系/属性,我想使用一个简单的点结构来迭代这个,类似于你如何使用Arr :: get()遍历数组 例: $data = [ 'foo' => [ 'bar' => ...
1
如何使用dplyr语法在R中编写循环“for”循环
问答我有一个广泛的代码块,我在R中使用dplyr语法编写.但是,我试图将该代码放在一个循环中,这样我最终可以创建多个输出文件而不是一个.不幸的是,我似乎无法这样做. 为了说明我的问题,让我们参考R中常用的 ...
1
google-bigquery – 如何使用DML语法更新BigQuery中的嵌套记录?
问答我有以下BigQuery架构,我正在尝试更新event_dim.date字段: 我使用标准SQL和新的BigQuery DML尝试了以下查询: UPDATE `sara-bigquery.exampl ...
1
语法 – Go语言中的赋值运算符
问答最近我在玩google的新的编程语言Go 并且想知道为什么赋值操作符:=在等号前面有冒号 有什么特别的原因,为什么语言的作者想使用name:="John"而不是name =&quo ...
1
列表中的混淆或YAML语法ansible playbook中的键
问答我是YAML和ansible的新手,我很困惑哪一行是关键,哪一行是列表.例如,在下面的剧本中,似乎" – "代表一个列表项. --- - hosts: all gather_fac ...
1
bool [,] – 这个语法在c#中意味着什么?
问答我在遗留代码中找到以下行: protected bool[,] PixelsChecked; 这里的意思是什么意思?::这是一个二维数组. 在.NET中,您可以使用两种不是单维的数组: >多维数 ...
1
这个语法在c#中意味着什么?
问答我可能没有正确的,但我在WebMethod上面看到了类似的东西: [return:(XmlElement("Class2"),IsNullable = false)] public ...
1
这样的语法在C#中意味着什么?
问答这样的语法在C#中意味着什么? public abstract class HostFactory<TApp> : ServiceHostFactory where TApp : IFoo ...
1
切换案例的这种语法在C中意味着什么?
问答我看到了一些像这样的c代码: int check = 10: switch(check) { case 1...9: printf("It is 2 to 9");break; c ...
2
这个语法在Haskell中意味着什么:([]:_)
问答我在一个函数([]:_)看到了这个 无法找到它的定义(Google不能很好地使用符号).那么究竟是什么呢? type Mat a = [[a]] myTranspose :: Mat a -> ...
1
语法 – 在Clojure中应用函数列表中的第一个
问答如果我有一个功能列表: (def lst'( – )) 我希望将该列表中的第一个()应用于数字列表,我会认为它 (申请(第一个)'(1 2 3 4)) 但显然你错了?我假设语法错误.我该怎么做呢? P ...
2
LIKE'[charlist]%’语法在MySQL中不起作用(phpMyAdmin)
问答有一个名为学生的表.我想提取名字以'n'或'p'或'y'开头的学生的名字.我知道在TSQL(MS SQL服务器)中,我可以按如下方式编写查询,它可以工作: SELECT * FROM Students ...
1
语法 – 在Kotlin中增加可空Int的简单而好的方法
问答在Kotlin中增加可空Int的最简单,最可读的方法是什么?除此之外还有其他方法吗? var myInt: Int? = 3 myInt = if(myInt!=null) myInt+1 else ...
1
Julia语法在julia-vim中突出显示
问答我使用gvim和julia-vim来编辑julia代码.我在Mac上使用julia 0.5,并在vundle上安装了julia-vim. 我的问题是扩展名为.jl的文件没有适当的突出显示.例如,如果突 ...
1
javascript – 这是什么JS语法?表达中的作业? (x!= null \u0026\u0026(y = x))
问答我正在使用这个JS插件,我遇到了一些我以前从未见过的语法.我理解它在做什么,但我不确定它为什么会起作用. 以下是其中一个实例的示例: settings.maxId != null && ...
2
这个语法在Haskell中意味着什么:_ | _或(_ | _)
问答在许多受人尊敬的文件中我一直看到这个相当令人尴尬的事情:_ | _或(_ | _) 无法找到它的定义(Google不能很好地使用符号).那么究竟是什么呢?::从here: – Bottom The m ...
1
vba – On Error Goto在EventHandler subs中不起作用
问答让我们假设这段代码: 模块1: Sub main() Dim cl As New Class2 On Error GoTo errorhandler1 cl.DoWork On Error GoTo ...