删除“ goto”语句后如何排序,使人们更容易理解?

时间:2019-01-23 02:40:45

标签: php goto

对该公司以前的项目进行维护,编写该项目的人员已经离开,现在我需要维护,但是现在该项目使用了很多“ goto”,我想知道如何阅读它。 删除“ goto”语句后如何排序,使人们更容易理解。简而言之,我想将左侧的凌乱代码格式化为图片中的右侧 how to format your messy code in the left side to be like the right side in the picture

//**this code
defined('IN_IA') or exit('Access Denied');
class Md_daojiaModuleSite extends WeModuleSite
{
    public function doPageUploadmap3()
    {
        goto A25dm;
        ADcuT:
        ZLMND:
        goto wJ44l;
        z_M2Z:
        if (empty($_FILES["file"]["tmp_name"])) {
            goto ZLMND;
        }
        goto RnW8Z;
        M61ng:
        $tempfile = ATTACHMENT_ROOT . "/audios/" . $name;
        goto ReGaV;
        A25dm:
        global $_GPC, $_W;
        goto z_M2Z;
        RnW8Z:
        $exname = strtolower(substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], ".") + 1));
        goto BO3TT;
        wJ44l:
        return $this->result(0, '', "attachment/audios/" . $name);
        goto Qx8PP;
        BO3TT:
        $name = md5(time()) . "." . $exname;
        goto M61ng;
        ReGaV:
        move_uploaded_file($_FILES["file"]["tmp_name"], $tempfile);
        goto ADcuT;
        Qx8PP:
    }
}

1 个答案:

答案 0 :(得分:1)

您基本上只是复制了口译员会做的事情:

  1. 从上至下,查看每个goto语句。

    goto A25dm;
    …
    
  2. 将相应的跳转标记和代码段直接拖到其后面。

    A25dm:                       # ← MARKER: starts section
    global $_GPC, $_W;
    goto z_M2Z;                  # ← next goto ends it
    
  3. 所以您最终得到了:

    //goto A25dm;                # → no longer needed
    A25dm:                       
    global $_GPC, $_W;
    goto z_M2Z;                  # → proceed with step 1
    

将每个marker:关联到goto之后,只需删除或注释掉它们即可。