
最近遇到了了这样一段有趣的代码:
<?php
if (true){
echo "expr evaluates to true...",PHP_EOL;
}else surprise:{
echo "expr evaluates to false...",PHP_EOL;
}
这段代码会输出什么呢?是输出if的内容还是else的内容?
但是他却if和else一起输出了:

首先我们应该了解一下surprise:是什么鬼?
这个其实是PHP的goto语句。
goto语句
PHP的goto是5.3版本新增的特性,goto 操作符可以用来跳转到程序中的另一位置。
该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记:
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
以上代码会输出:Bar

那么当没有goto操作符跳转程序的时候程序会如何执行呢?
<?php
echo 'Foo';
a:echo 'Bar';
?>
以上代码会输出:FooBar

我们发现没有goto时 Bar仍然可以正常输出,但是失去了goto语句的跳转效果。
其实a:就是一个goto的标记,而上文中的{}只是用于标记代码块的。
所以上文讲到的代码我们可以理解为:
<?php
if (true){
echo "expr evaluates to true...",PHP_EOL;
}else;
surprise:{
echo "expr evaluates to false...",PHP_EOL;
}
suprise作为独立语句块,并不能跟前面的语句关联,else 直接中断,相当于else后面没有执行语句,else后面的2个括号,也只是goto标记的代码块,跟else毫无关联。
我们也可以将suprise替换为任意的标记名都是可以输出的。

网友评论