用PHP实现goto
在PHP5.3中已经实施了臭名昭著的goto。
敢于实施就意味着它本身是有用的。
让我们用goto来重新实现前面创建的斐波那契数列。
<?php
function fib5($n){
$fib= [0, 1];
$count = 1;
loop:
$count++;
$fib[$count] = $fib[$count-1] + $fib[$count-2];
if(!isset($fib[$n])){ goto loop; }
return $fib[$n];
}
哇,意想不到的容易理解。
而且速度比fib3()还要快。
我本来打算写”最好别使用goto”,但为什么变成这样了。
“跳转语句goto的真正可怕之处(以及有用之处)在于它可以无视任何上下文而强制跳转。尽管在PHP中有一些限制,比如只能在同一文件中进行移动,或者在函数内和函数外之间进行移动,但其威力仍然非常强大。”
<?php
// http://www.php.net/manual/ja/control-structures.goto.php#109027
$link = true;
if($link)goto iw_link_begin;
iw__link_begin:
if($link)goto iw_link_text;
iw__link_text:
if($link)goto iw_link_end;
iw__link_end:
goto iw_end_gt;
iw_link_begin:
echo'<a href="#">';
goto iw__link_begin;
iw_link_text:
echo'SampleText';
goto iw__link_text;
iw_link_end:
echo'</a>';
goto iw__link_end;
iw_end_gt:
// 普通に書くとこう
if($link)iw_link_begin();
if($link)iw_link_text();
if($link)iw_link_end();
function iw_link_begin(){
echo'<a href="#">';
}
function iw_link_text(){
echo'SampleText';
}
function iw_link_end(){
echo'</a>';
}
这个例子是在手册的评论中写的,但如果这样的东西被交付,只能打击实施者。
在”goto”标签中,似乎只能使用值。甚至不能指定变量和常量。
<?php
$a = 'label1';
goto $a;
label1:
这样的代码会导致解析错误。
嗯,万一这样的代码能够运行,肯定会进一步陷入地狱中。
实际上,在 PHP 中几乎没有使用 goto 的场合。
由于其他函数非常丰富,除非有特定需求,否则基本上用不到它。
即使是多重循环的脱离,PHP 也可以通过设置脱离级别来实现。
我真的不知道应该在什么情况下使用它。