18

「goto」ステートメントは、ASM またはその他のアセンブラー言語からそのまま出てきます。

ここにリンクがあります: http://be2.php.net/manual/en/control-structures.goto.php

私は疑問に思っています: これは私のコードをよりよく整理するために何ができますか? 大規模なプロジェクトでこれを台無しにすることなく実装するにはどうすればよいですか。goto を使用すると前後にジャンプできるため、これを間違った方法で使用すると、偶発的な代入と無限ループが発生するのを待っています。

誰かがこれの良い使い方の例を教えてもらえますか?

編集:わかりました、私はいくつかの返信を見てきましたが、明らかに「goto」ステートメントの使用とそれが悪いことについて幅広いコンセンサスが存在します.

だから私はまだ疑問に思っています.なぜPHPはわざわざそれを言語に追加するのでしょうか. 彼らがその中に何かを見ていないなら、彼らはそれをしません... では、なぜですか?

また、一般的な「goto」に関するStackOverflowの議論はこちら

EDIT2: この質問が goto ステートメントについて悲しいことに多くの悪いことを引き起こしたのを見て、私は行って父に尋ねました。彼は 52 歳で、産業技術者です。
彼は、彼の時代にかなりの量のプログラミングを行い、そのほとんどが FORTRAN と COBOL であると私に何度か言いました。現在、彼は IT サービス、サーバーおよびネットワーク管理などを行っています。

とにかく、彼は「私の時代に戻って...」についていくつか言いました。
それについて少し話し合った後、彼はgotoステートメントに戻り、学生時代に戻っても、それが賢明ではないことをすでに知っていたと言いました.それを使用するという考えはありましたが、当時はそれほど良いものはありませんでした. Try/catch はまだ数年先のことで、エラー処理はほとんど存在しませんでした。
では、プログラムをチェックするために何をしましたか? 最後に数行を追加して、出力とコードのチェックインに必要なすべてを印刷できるようにしてから、「goto printing;」などの行を配置して、データの印刷を開始します。

このようにして、コードを徐々にデバッグしていきました。

彼は、現代のプログラミングの世界での goto の使用はほとんど役に立たないことに同意します。彼が正当だと考える唯一の用途は、極端なデバッグや予期しない状況で使用される「緊急休憩」です。のようなものgoto fatal_error;で、コードの「fatal_error」部分にいくつかのことを実行させて、詳細な結果を表示します。
ただし、何かを作成している間だけです。完成品には goto ステートメントを含めないでください。

後期編集: PHP5.3/PHP6 の「goto」に関する別の議論

4

16 に答える 16

14

適切な PHP コードを作成している場合は、goto を使用する必要はありません。怠惰なプログラミングにつながるだけなので、彼らがそれを追加しているのは間違いだと思います。

見る

http://www.procata.com/blog/archives/2004/07/29/goto-in-php/

これを PHP に追加したことと、スタック オーバーフローについては、こちらを参照してください。

GOTO はまだ有害と見なされていますか?

于 2009-04-06T21:37:21.243 に答える
11

の用途は 2 つしか見つかりませんでしたgoto

  1. ネストされたループから抜け出すため。gotoしかし、ほとんどの新しい言語には、とにかくこれを行うメカニズムがあります ( break <number>PHP やbreak <loop label>Java など)。
  2. 関数の最後にあるクリーンアップ セクションに移動します。しかし、繰り返しますが、これはガベージコレクションされた言語ではあまり役に立ちません。

gotoつまり、何かに使用する必要があるかどうかわからない場合は、使用しないでください。

于 2009-04-06T21:38:14.393 に答える
3

言語でgotoを使用する際に私が目にする主な用途は、言語間で移植する機能です。私はCでパーサージェネレーターを作成しました。これはgotoでパーサーを生成し(より適切な制御構造を実装するよりもgotoを使用する方が簡単だったため)、PHPへの移植はそれほど頭痛の種ではありません。

于 2010-05-31T07:24:25.940 に答える
3

goto は、以下の疑似コードで、スタックの巻き戻しのコードの重複を減らすのに役立ちます。

do A
if (error)
    goto out_a;
do B
if (error)
    goto out_b;
do C
if (error)
    goto out_c;
goto out;

out_c:
undo C

out_b:
undo B:

out_a:
undo A

out:
return ret;

(Linux カーネル アーカイブ メーリング リストから取得した、Robert Love による疑似コード: https://lkml.org/lkml/2003/1/12/203 )

于 2011-07-16T00:19:15.573 に答える
2

従来のVBコーディングでは、gotoの使用は、次のようなtry/catchエラー処理をエミュレートするのに便利です。

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Exit Function

 Catch:
   ' error occured - do something else
   MyFunction = Err.Description

 '
 '-- end of error block

End Function

...そしてここにtry/catch/finallyをエミュレートする方法があります..

Function MyFunction() as String

'-- start of error block
'
 On Error Goto Catch
   ' do something here that might cause an error
   MyFunction = "IT WORKED"
   Goto Finally

 Catch:
   ' error occured - do something else
   MyFunction = Err.Description
   Err.Clear

 Finally:
   ' put your finally code here

 '
 '-- end of error block

End Function

関数の最後のクリーンアップにも役立ちますが、別の関数を呼び出してそのクリーンアップを実行できる場合もあると思います。

正直なところ、PHPで「うーん、gotoステートメントがあればいいのに」と思ったことがありません。彼らがこれをやろうと決めた理由についてはまだ読んでいませんが、彼らはかなり賢く、これまでのところPHPを非常に良い方向に導いてきたので、おそらく私たちがまだ実現していないニーズを予想しています。

于 2009-04-07T13:53:33.190 に答える
2

デバッグ目的で使用できるため、ワークフローを一時的に変更するためだけにコードのブロックをコメントアウトしたりリファクタリングしたりする必要はありません。

于 2009-04-06T23:46:53.740 に答える
1

Goto は主に、有限状態マシンを記述するときに使用されます。文脈自由文法を解析するとき、実際にはそれらのいずれかが必要になります。goto if が switch ブロック内で別のケースにジャンプする有効なステートメントでなくても問題ありませんがcontinue $case;、最近の多くの言語のようにケースの範囲を持っていません。それまでは、goto でほとんど行き詰っています。

于 2010-09-28T14:30:19.870 に答える
1

gotoの上手な使い方などありません。

おそらく、複数のネストされたループから抜け出すのに役立つかもしれませんが、「break 2」などを使用してすでにそれを行うことができます。Java のようなラベル付きブレークは、この目的では goto よりも優れています。

おそらく、例外を使用せずに記述されたコードで、失敗したステートメントの束の最後までスキップする必要がある場合にも役立ちます。しかし、それはもっとくだらないコードでくだらないコードを修正するだけです。

于 2009-04-06T21:33:38.803 に答える
1

コードで goto を使用したことがないことを認めます。:)

私の唯一の理由は、他の言語から PHP への最短の移行ルート (実際には制御構造に触れずに言語を変更するだけ) を促進し、移植の第 2 段階でコードをリファクタリングすることです。

個人的には、教育を受けた同僚を信じています。彼らはループからの条件付きブレークを回避できるため、goto の誘惑に抵抗できるでしょう。

于 2009-04-07T10:53:20.050 に答える
1

goto複数のネストされたifを避けるために使用することがあります。これは、ロジック、構造、またはプログラム フローだけでなく、コードがどのように見えるかだけの場合もあります。

于 2017-08-31T13:11:39.557 に答える
0

生成されたコードはgotoをうまく利用できると思います。生成されたコードの良いところは、それを維持する必要がないことです-あなたはそれを再生成するだけです。

于 2009-12-14T11:23:03.870 に答える
0

gotoそれは言語に含まれていたものであり、プログラミングの実践が改善されたために廃止される予定でしたが、実際には何かである必要があります。今それを追加することは、後退したように思えます。

于 2009-04-06T23:56:20.520 に答える
0

goto の大きな利点は学習曲線です。Visual Studio や Mac などのツールがなぜうまく機能するのか疑問に思う人もいるでしょう。その理由は、人々が優れた製品以上のものを求めているからです。彼らは、わずか 1 時間ほどで使い方を学べる優れた製品を望んでいます。現在、多くのプログラマーは、仕事の 1 つとしてプログラミングのみを行っています。非常に多くの本で、決して goto を使用してはならないと述べているのを目にします。5と言っただけでも後藤の良さの証ですね!!!!! 説明するのに章全体が必要な例外構造を含む 5 つのことを教える時間がありません!!!!! 本当に必要なのは、30 秒で説明できる簡単な goto だけです。もちろん、プログラマーが望むなら、それらを使って悪いコードを作成することもできますが、ほとんどのプログラマーはそうではありません。t は悪いコードを書きたくありません。私たちのラボのほとんどの goto は、コードを理解して習得するのが非常に簡単になりました。2000ページの本を読むよりもずっと。

于 2013-07-27T04:34:08.767 に答える
0

簡単に言えば、goto はシングル スレッド コードでのパフォーマンスが大幅に向上する限られたスタック スペースの回避策です。スタック スペースまたはパフォーマンスに対処する以外に、その使用は少なくとも不必要であり、不必要な複雑さを引き起こすため、せいぜい不適切です。

機械語を除くすべての言語で 200 万行以上のコードを書きました :-)。その使用が必要になったのは 2 回だけで、両方とも大きなツリー データセットの検査と並べ替えのためです。

于 2017-04-21T23:09:07.633 に答える
-1

前に述べたように、 goto は、通常は言語解析または有限状態マシンで発生するアルゴリズムの一部のタイプでのみ実際に必要です。PHP に goto がないことを見逃したことはありません。

OTOH、私は 2 つの構造のみが関数と条件付き goto である言語でプログラミングしました: SNOBOL4。スパゲッティ コードのリスクが非常に高いため、ほとんどの SNOBOL4 プログラマはそれを避けるように注意を払っていました。しかし、goto によって、いくつかの非常にタイトなプログラミングや創造的なループ実行などが可能になりました。goto しかない場合は、FSM タイプのループを実行する方が実際にはいくぶん簡単です。

于 2009-04-07T00:44:22.743 に答える