近日在微博看到了这样一个有趣的代码

代码如下:

<?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替换为任意的标记名都是可以输出的

Last modification:September 6th, 2020 at 10:56 pm