5

PHPが「goto」コマンドの導入を計画しているという噂を聞いたことがあります。何をしているの?

少し検索してみましたが、ひどく説明的なものは見つかりませんでした。GOTO 10「 」のようなコマンドではないことを理解しています。

4

7 に答える 7

9

実際の G​​OTO を追加するのではなく、BREAK キーワードを拡張して静的ラベルを使用します。基本的には、入れ子になったswitch if ステートメントから抜け出す機能が強化されます。これが私が見つけた概念の例です:

<?php
for ($i = 0; $i < 9; $i++) {
    if (true) {
        break blah;
    }
    echo "not shown";
    blah:
    echo "iteration $i\n";
}
?>

もちろん、GOTO の「噂」が広まると、何人かの悪者が追加のCOMEFROMジョークを広めるのを止めるものは何もありませんでした。あなたのつま先にいてください。

以下も参照してください。

http://www.php.net/~derick/meeting-notes.html#adding-goto

于 2008-08-21T06:14:47.763 に答える
6

私は、PHPデザイナーがどれほど愚かであるかにいつも驚いています。GOTOを使用する目的が、複数ネストされたループからの脱却をより効率的にすることである場合、より良い方法があります。ラベル付きコードブロックとラベルを参照できるbreakステートメント:

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

これで、どのループ/ブロックを終了するかが明確になり、終了は構造化されます。本物のgotoのように、これでスパゲッティコードを取得することはできません。

これは古い、古い、古いアイデアです。優れた制御フロー管理構造の設計は70年代から解決されており、これらすべてに関する文献は作成されてから長い年月が経っています。Bohm-Jacopiniの定理は、関数呼び出し、if-then-else、およびwhileループを使用して何でもコーディングできることを示しました。実際には、深くネストされたブロックから抜け出すために、Bohm-Jacopiniスタイルのコーディングには追加のブールフラグ(「ループから抜け出すためにこのフラグを設定する」)が必要でした。内側のループ)。if-then-else、さまざまなループ(while、for)、およびbreak-to-labeledブロックを使用すると、効率を損なうことなく、任意のアルゴリズムをコーディングできます。Cがしたことをコピーする代わりに、なぜ人々は文学を読まないのですか?Grrr。

于 2009-07-03T09:07:18.810 に答える
3

確かに、私は PHP プログラマーではなく、PHP の GOTO の正確な実装がどのようになるかはわかりませんが、GOTO についての私の理解は次のとおりです。

GOTO は、他のステートメントと同様に、より明示的なフロー制御ステートメントです。ネストされたループがいくつかあり、1 つのものだけを見つける必要があるとします。条件付きステートメント (または複数) を入れることができ、条件が適切に満たされた場合、GOTO ステートメントを使用してすべてのループから抜け出すことができます (条件付きステートメントでネストの各レベルで「break」ステートメントを使用する代わりに)はい、従来の実装では、GOTO ステートメントが名前でジャンプできるラベルに名前を付けることだと思います。次のようなことができます。

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

これは、GOTO ステートメントを使用しない場合よりも単純な (そして効率的な) 実装です。同等のものは次のようになります。

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

2 番目のケース (一般的な方法) では、3 つの条件文があり、1 つだけの場合よりも明らかに遅くなります。したがって、最適化/単純化の理由から、密にネストされたループで GOTO ステートメントを使用することをお勧めします。

于 2008-08-21T06:11:30.483 に答える
1

steveth45の例では、代わりに関数を使用できます。

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);
于 2008-08-21T07:45:22.397 に答える
0

現在PHP 5.3にあるようですが、まだ完全には文書化されていません。私が知る限り、goto 構文は C と共有されているため、簡単に理解して使用できるはずです。Dijkstra の警告を覚えておいて、必要な場合にのみ使用してください。

于 2008-08-21T06:14:40.587 に答える
0

@スティーブス45

私の経験則では、コードを 3 レベル以上ネストしている場合は、何か間違ったことをしているということです。

次に、複数の break ステートメントや goto :D の使用について心配する必要はありません。

于 2008-08-21T06:16:43.297 に答える
0

gotophp -> http://php.net/manual/en/control-structures.goto.phpにありますが、私はそれを使用しません。通常のコードを書くだけです...

于 2013-04-24T10:55:13.210 に答える