PHPが「goto」コマンドの導入を計画しているという噂を聞いたことがあります。何をしているの?
少し検索してみましたが、ひどく説明的なものは見つかりませんでした。GOTO 10
「 」のようなコマンドではないことを理解しています。
PHPが「goto」コマンドの導入を計画しているという噂を聞いたことがあります。何をしているの?
少し検索してみましたが、ひどく説明的なものは見つかりませんでした。GOTO 10
「 」のようなコマンドではないことを理解しています。
実際の GOTO を追加するのではなく、BREAK キーワードを拡張して静的ラベルを使用します。基本的には、入れ子になったswitch if ステートメントから抜け出す機能が強化されます。これが私が見つけた概念の例です:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
もちろん、GOTO の「噂」が広まると、何人かの悪者が追加のCOMEFROMジョークを広めるのを止めるものは何もありませんでした。あなたのつま先にいてください。
以下も参照してください。
私は、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。
確かに、私は 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 ステートメントを使用することをお勧めします。
steveth45の例では、代わりに関数を使用できます。
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
@スティーブス45
私の経験則では、コードを 3 レベル以上ネストしている場合は、何か間違ったことをしているということです。
次に、複数の break ステートメントや goto :D の使用について心配する必要はありません。
goto
php -> http://php.net/manual/en/control-structures.goto.phpにありますが、私はそれを使用しません。通常のコードを書くだけです...