2013-10-04 64 views
7

有沒有一種方法來爲PHP goto定義全局標籤(類似於變量),以便在函數聲明中使用它。我要做到以下幾點:使用goto裏面的函數php

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


someLine: 
// .... 

myFunction(); 

,當我使用此代碼,它說

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

我知道,這是不推薦使用goto聲明。但我需要它在我的情況。我知道,也許永遠也有goto的替代品,只是在我的情況下,它會令你無法轉到外的功能,我相信代碼變得更輕鬆易懂

+0

所以,你想跳出功能?這是不可能的。你想達到什麼目的? – Jim

+0

@Jim,我需要檢查函數內部的條件並基於它們,轉到特定的行。謝謝 – dav

+0

你是用什麼*作爲*?幾乎總是有使用goto的替代方法。 – Jim

回答

6

http://php.net/manual/en/control-structures.goto.php

直接引用: 這是不是完全不受限制的轉到。目標標籤必須位於同一個文件和上下文中,這意味着您不能跳出某個函數或方法,也不能跳入其中。

這可能與php被解析的事實有關,跳出某個函數會導致內存泄漏,或者因爲它從未正確關閉。還有其他人在上面說過的,真的不需要轉到。你可以從函數中返回不同的值,併爲每個值設置一個條件。 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'; 
} 
2

有沒有辦法或縮小功能的跳轉。但既然你聲明你需要它,這裏有一條替代路線。

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


someLine: 
// .... 

$func = myFunction(); 
if($func == true) goto someLine; 
+0

是的,這種方式是我可以選擇的方式,但是我的功能條件有點複雜並且使用goto inside函數會使代碼更容易。謝謝 – dav

+2

在這種情況下,代碼的「簡單」並不是真的。除了用正確的方式編程外,沒有別的選擇 - 這意味着不使用goto。 – BetaBlaze

2

如前所述,你不能。至於「我需要它」,我非常懷疑這一點。無論你在someLine上有什麼代碼:都可以很容易地變成一個函數,如果需要你可以從另一個函數中調用。

0

耶有一種方法,只要該函數聲明在同一個php文件或包含如果在另一個腳本,

跳轉到someline就是回到你老兄的是跳轉代碼的最佳方式所以,如果功能被稱爲返回值收到..希望這可以幫助

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 */ 
+0

你可能不會從一個函數轉到someline之外,但你可以返回一個eval或者返回一個簡單的字符串返回「goto someline」,但是確保像eval(foo())那樣評估你的函數調用:where foo返回goto,我認爲這是工作傢伙更好地嘗試 –