2013-10-04 36 views
7

PHP gotoのグローバルラベル(変数のようなもの)を定義して関数宣言内で使用する方法はありますか?私は、次の操作を実行したい:私はこのコードを使用する場合goto inside function php

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


someLine: 
// .... 

myFunction(); 

それは

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

言う私はgotoステートメントを使用することは推奨されていないことを知っています。しかし、私の場合はそれが必要です。 http://php.net/manual/en/control-structures.goto.php

直接引用:: これは私はちょうど私の場合、それはあなたが、私は信じている機能の外のgotoできないコードが少し簡単で理解しやすい

+0

関数外にジャンプしたいですか?これは不可能です。あなたは何を達成しようとしていますか? – Jim

+0

@ジム、私は関数内の条件をチェックし、それらに基づいて、特定の行に移動する必要があります。ありがとうございました – dav

+0

この*を*使用していますか?ほとんどの場合、gotoを使用する代わりに使用できます。 – Jim

答えて

6

になるだろう、おそらく常にgotoの選択肢があることを知っています完全な無制限の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'; 
} 
2

中や関数の外にジャンプする方法はありません。しかし、あなたがそれを必要としていることから、別のルートがあります。

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


someLine: 
// .... 

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

ええ、このやり方は私にも似ていますが、私の機能の条件は少し複雑です関数内でgotoを使用すると、コードが簡単になります。ありがとう – 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

関数からgotoを自分自身の外側に移動することはできませんが、evalを返すか、単純な文字列を返すだけですが、eval(foo())のような関数呼び出しを評価してください:where foo戻って行く、私はそれがうまくやってみようと思う –