9

有没有办法为 PHP 定义全局标签(类似于变量)goto,以便在函数声明中使用它。我想做以下事情:

function myFunction() {
   if (condition) {
     goto someLine;
  }
}


someLine:
// ....

myFunction();

当我使用此代码时,它说

PHP Fatal error:  'goto' to undefined label "someLine"

我知道不建议使用goto语句。但在我的情况下我需要它。我知道也许总是有替代品goto,就我而言,它会使代码更容易理解

4

4 回答 4

9

你不能转到我相信的函数之外:http: //php.net/manual/en/control-structures.goto.php

直接引用:这不是一个完全不受限制的 goto。目标标签必须在同一文件和上下文中,这意味着您不能跳出函数或方法,也不能跳入其中。

这可能与php被解析并跳出函数会导致内存泄漏或其他原因有关,因为它从未正确关闭。同样正如上面其他人所说,你真的不需要goto。您可以从函数返回不同的值,并为每个值设置一个条件。Goto 对于现代编码来说只是非常糟糕的做法(如果您使用的是基本的,则可以接受)。

例子:

function foo(a) {
    if (a==1) {
        return 1;
    } elseif (a==3) {
        return 2;
    } else {
        return 3;
    }
}

switch (foo(4)) { //easily replaceable with elseif chain
    case 1: echo 'Foo was 1'; break; //These can be functions to other parts of the code
    case 2: echo 'Foo was 3'; break;
    case 3: echo 'Foo was not 1 or 3';
}
于 2013-10-04T15:42:08.643 回答
3

没有办法跳入或跳出函数。但既然你说你需要它,这里有一条替代路线。

function myFunction() {
   if (condition) {
     return true;
   }
   return false;
}


someLine:
// ....

$func = myFunction();
if($func == true) goto someLine;
于 2013-10-04T15:44:49.220 回答
3

如前所述,您不能。至于“我需要它”,我非常怀疑这一点。无论您拥有什么代码,都someLine:可以轻松地将其制成一个函数,如果需要,您可以从另一个函数调用该函数。

于 2013-10-04T15:47:50.277 回答
0

是的,只要该函数在同一个 php 文件中声明或包含在另一个脚本中,就有一种方法,

跳到某行的最好方法是返回你的 goto 代码,这样如果函数被调用,就会收到返回值。希望这会有所帮助

 function foo($b="30")
 {
 $a=30;
 if($a==intval($b))
 return "someline:goto
 someline";
 }

try{
eval(foo());
}
catch(IOException $err)
{
 exit($err);
}

/*someline is somewhere here   
for example */
于 2014-10-24T15:11:00.460 回答