用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 也可以通过设置脱离级别来实现。
我真的不知道应该在什么情况下使用它。

广告
将在 10 秒后关闭
bannerAds