制御構造
この章の焦点
◆ ロジックテストの確立と結合
◆ 分岐処理に if と switch を使用する
◆ while と for を使用する
◆ exit と die を使用して終了するページの実行
さまざまな状況に基づいてプログラムにさまざまな実行を決定させることができない場合、有用なプログラムを書くことは困難です。簡単に言えば、表示変数を出力するプログラム コードの動作は、特定の変数の値に依存します。プログラマは、さまざまなアクションを使用して、プログラムがイベント (外部世界、時間、ユーザーに応じて) に異なる応答をするようにすることができます。入力またはデータベースのコンテンツなど)。
この種のプログラム応答には「制御構造」が必要です。この構造は、異なる状況下で異なるプログラムコードで実行されるべき命令を制御できます。前の章では、if などの制御構造を使用しましたが、詳しくは説明しませんでした。この章では、PHP が提供する各制御構造を紹介し、それらがどのように動作し、動作するかを詳しく説明します。
経験豊富な C 言語プログラマー向け: PHP のすべての機能の中で、「コントロール」部分は C 言語に最も似ています。C 言語で元々使用されていた構造はすべてここで使用でき、同じように動作します。方法。 C 言語プログラマーの経験がある場合は、この章を飛ばして、この章の最後にあるセクションを直接読んでください。
これから説明する制御構造の 2 つの主なタイプは、分岐とループです。分岐は、特定のテストに応じて、プログラムの実行パスの分岐であり、後続のパスは異なる場合もあれば、再び結合する場合もあります。ループは、分岐の先頭に戻る実行パスを持つ分岐タイプの 1 つで、繰り返しテストしたり、ループで実行したりできます。
制御構造を効果的に利用する前に、テスト条件を効果的に構築できる必要があります。最も単純なテストから始めて定数 TRUE と FALSE について学び、次にこれらのテストをより複雑なコードで使用します。
ブール式
この章で紹介するすべての制御構造には、2 つの異なる部分が含まれています。1 つはテスト部分 (どの方向に進むかを決定します)、もう 1 つはテスト コード (別個の (分岐またはループ) テストです)はブール演算の評価によって行われ、演算式の結果が「真」か「非真」の判定となります。
ブール定数
最も単純な演算タイプは単純な値(simple value)であり、最も単純なブール値はTRUEとFALSE定数であり、その逆も同様です。たとえば、次のように if-else ステートメントのテスト セクションに埋め込むことができます。
if (TRUE)print("This will always print") elseprint("This will Never print");実際、説明は次と同じです: if (FALSE) print ("これは印刷されません"); elseprint ("これは常に印刷されます");
論理演算子
論理演算子は他のロジックを組み合わせることができます。 (ブール値とも呼ばれる) 値を使用して、新しいブール値を生成します。 PHP は、標準の論理演算 (and、or、not、および xor) をサポートしています。表 7-1 に示すように、最初の 2 つは代替バージョンがあります。
7-1 論理演算記号
C 言語プログラマの場合は、「&&」および「||」演算子に精通している必要があります。 「!」演算子は、明らかな理由から、「NOT」と呼ばれることがよくあります。
次の式は論理演算子の例です。
(($statement_1 && $statement_2)||
( ! $statement_1 && ! $statement_2) || これは「トートロジー」であり、変数の値に関係なく、2 つの変数の可能な実際の値が 4 つあることを意味します。それぞれが「&&」演算子で表される組み合わせです。これらは「||」演算子で結合されているため、次の例は「」のより賢い例です。トートロジー":
(($statement_1 と $statement_2 と
$statement_3) xor
((! ( $statement_1 と $statement_2)) または
(! ( $statement_1 と $statement_3)) または
(! ( $statement_2 と $statement_3))))
この操作の意味は次のとおりです: 「3 つの物語的ステートメントが与えられた場合、次の 2 つの状況のうち 1 つだけが発生します。 1: 非 Ne の 3 つのステートメントがすべて true の場合、 true ではないステートメントのペアであること。「
論理演算子の優先順位
」他の演算子と比較して、一部の論理演算子は優先順位が高くなります。ただし、括弧を使用して優先順位を変更することもできます。演算子は他の演算子よりもはるかに低い優先順位で配置されているため、指定された演算子 (=) は「and」よりも厳密に関連付けられていますが、「&&」よりは緩いです
演算子の優先順位と相関関係の完全なリストがあります。 http://www.php.net/ のオンライン マニュアルを参照してください。
論理演算子のショートサーキット
ブール演算子の非常に便利な機能は、左から右に結合し、「ショートサーキット」するように設計できることです。最初のパラメータが真の値であると判断された場合、2 番目のパラメータの計算を続ける必要はありません。パラメータ。たとえば、2 つの数値の非常に近似的な比率を決定する場合だけでなく、による除算の可能性を回避する場合にも使用されます。エラーは 0 です。最初に除数が 0 ではないことをテストして、「!= (等しくないという意味)」演算子を使用します:
if ($denom != 0 && $numer/ $denome>2)
print (「2 倍以上!」);
$denom が「0」の場合、式が true か false かに関係なく、「&&」演算子は「true ではない」値を返す必要があります。短絡動作のため、2 番目の式は評価されず、エラーが回避されます。 $denom が「0」に等しくない場合、「&&」演算子には真実の結論に達するのに十分な情報がないため、2 番目の演算子が評価されます。
これまで、TRUE 定数と FALSE 定数、およびそれらを組み合わせて他の true 値と false 値を形成する方法について正式に説明してきました。次に、実際のブール演算テストを実行する演算子を見てみましょう。
比較演算子
表 7-2 は、数値または文字列に使用できる比較演算子を示しています (「非整数値には注意してください」の説明に注意してください)。
表 7-2 比較演算記号
以下の例は、常に true となる複合テストが続くいくつかの変数の仕様です。 ($four ===$four)and($three !=$four)and($three=$there)and($three $three) and($my_pi ”); elseprint (“本当に入力しましたか? ”):
非常によくある間違いに注意してください。指定演算子 (=) と比較演算子 (==) を混同することです。 "if($three = $four).." このステートメントは誤って $three と $four を同等の変数 (型) として設定する可能性があります。$four が true の場合、そのテスト結果は true になります。
演算子の優先順位
優先順位に依存しすぎると、コードを読む人が混乱する可能性がありますが、比較演算子の優先順位がブール演算子よりも高いことに注意することをお勧めします。次の例を見てください:
If ($small_num> 2 && $small_num
if に必要な 2 つの括弧を除いて、それ以上の括弧は必要ありません。
文字列比較
比較演算子は、文字列または数値を比較するために使用できます (「非定数に注意する」の説明に注意してください)。次のプログラム出力に対応する例を示したいとします。
if (("Marx"”);}
整数以外の数値には注意してください
比較演算子は数値または文字列を操作できますが、次の 2 つの点に注意する必要があります。問題。
まず第一に、倍精度浮動小数点 (または整数と倍精度浮動小数点) の大小比較は一般に安全ですが、倍精度浮動小数点の等価比較は特に危険な場合があります。数値計算の結果を比較する場合はより注意してください。問題は、理論的に等しい 2 つの値がわずかに異なる原因となる「丸め誤差」です。
第 2 に、比較演算子は数値と同じ方法で文字列に対して比較演算を実行できますが、PHP は自動的に型変換を実行するため、文字列を数値として解釈すると、予期しない結果が得られることがあります。たとえば、次のコードです。
$string_1 = “00008”; $string _2 = “007”; $string_3 = “00008-OK”; If($string_2 ") ; If ($string_3 より小さい"); If ($string_1 より小さい");
出力の結論は次のとおりです:
007 は 00008 より小さい //数値の比較
00008-OK は 007 より小さい //文字列の比較
00008 は 00008-OK より小さい //文字列の比較により競合が生成されます
可能であれば, PHP は、この方法で比較の両側を処理できる場合、文字列ではなく数値で比較します。 PHP4 設計者は、これをバグではなく機能として扱います。私たちの観点からは、比較中に文字列が数値に変換される可能性がある場合は、strcmp() 関数を使用する方がよいと考えられます (第 10 章を参照してください)。
三項演算子
非常に便利な構造は三項条件演算子で、ブール演算子と「真実」分岐構造の間の役割を果たします。この関数には 3 つの操作があり、最初の操作の値は、評価後に必要な操作を決定するために使用されます。演算子の構文は次のとおりです。 yes-expression:no-expression
test-expression が true の場合、この演算子の値は yes-expression の結果となり、それ以外の場合は no-expression の結果になります。
たとえば、次の操作では、2 つのパラメーターのどちらが大きいかに応じて、$max_num を $first_num または $second_num として指定します。ご覧のとおり、上記の説明は次と同等です:
if ($first_num >$second_num )
$max_num = $first_num ;
else
$max_num = $second_num;
上記の例を使用した場合演算子はより簡潔になります。
分岐構造
分岐の 2 つの主な構造は、if と switch です。if は最も一般的に使用されるメイン分岐の選択肢であり、通常、誰もが最初に学ぶ条件付き構造です。 switch は、単一の値に基づいて複数の分岐が必要な場合や、一連の if ステートメントが非常に煩雑な場合など、場合によっては良い選択となるため、switch の使用が非常に適しています。
if – else ステートメント
if の構文は次のとおりです:
if(test)
statement-1
または、オプションの else 分岐を持つこともできます:
if(test)
statement-1
else
statement-2
if ステートメントが処理されると、テスト操作が評価され、結果は次のようになりますブール値として解釈されます。 test が true でなく、else 節がない場合は、if 構造の後の次のステートメントが実行されます
文法における「ステートメント」は、セミコロンで終わる単一のステートメントであることも、囲むこともできることに注意してください。中括弧内 物語ブロック、または別の条件構造 (それ自体が 1 つの物語とみなすことができます)。条件は、相互に任意の深さまでネストできます。さらに、ブール演算子は、実際のブール値 (つまり、TRUE、FALSE、またはブール演算子または関数の結果)、またはブール値として解釈できるその他のタイプの値にすることができます。
ボリンジャー値の詳細については、第 6 章を参照してください。簡単に言うと、数字「0」、文字列「0」、空の文字列「"」は真ではなく(false)、その他の値はすべて真(true)になります。
次の例は、2 つの数値間の絶対差を出力します。これは、ネストされた条件の使用を示し、テスト結果をブール値に解釈することにも言及しています。 first > $sec){$difference = $first - $second;print("その差は $difference
");}else{$difference = $sec - $first;print( "その差は $difference");}elseprint("違いはありません
");
このコードは、数値「0」が真ではない値として解釈されることに依存しています。差が「0」の場合、テストはは失敗し、出力には「差異なし」というメッセージが表示されます。差異がある場合は、1 ステップのテストが実行されます (「$first != $second」のように直接記述するのは同じであるため、この例は意図的に作成されています)。前の例は理解しやすいです)。
追加の else
この時点で、以前に Pascal を使用したことのあるプログラマは、else 部分が少し奇妙であることに気づいているかもしれません。つまり、else 節はどの if に属しているのかをどのように判断するのでしょうか。ルールは実際には非常に単純で、Pascal を除く他の言語とほぼ同じです。もちろん、最初は中括弧で制限された範囲に従って、他のものは最も近いものと照合されます。 if ステートメントが独立したままであり、else ステートメントと一致する必要がないことを確認したい場合は、以下に示すように、if ステートメントを 1 組の大きな円弧で囲むことができます。
if($num % 2 = =0 )// $num 偶数ですか? {if ($num > 2)print(“num は素数ではありません
”); elseprint(“num は奇数です
”); $num が 2 より大きい偶数の場合、プログラム コード$num が奇数の場合、「num は素数ではありません」と出力されます。$num がちょうど 2 の場合は、何も表示されません。中括弧が省略されている場合、else が内側の if に追加されるため、$num が 2 に等しい場合、コードは誤って「num は奇数です」と出力します。$num が実際に奇数である場合、コードは何も実行しません。
この章の例では、第 12 章で説明されている剰余演算子 (%) がよく使用されます。これらの例では、読者は「$x % $y」が「0」であり、「$x は $y で割り切れる」ことを意味することだけを知る必要があります。
Elseif
次のネストされた if ステートメントに示すように、カスケード タイプのテストを実行するのが非常に一般的です:
if ($day == 5)print(“Five Golden Rings
") ; elseif ($day ==4)print ("4 羽の鳴く鳥
"); elseif ($day ==3)print("3 羽のフランス鶏
"); elseif ($day ==2 )print ("キジバトを飛ばす
"; elseif ($day ==1)print("梨の木のヤマウズラ
");
このタイプは非常に一般的で、対処するための特別な elseif 構造があります。前の例を次のように書き換えることができます:
if ($day == 5)print("Five Golden Rings
")elseif($day == 4)print(" Four Calling Birds"); elseif($day == 3)print("3 羽のフランス鶏
") elseif($day == 2)print("2 羽のキジバト
"); =1)print("ナシの木のヤマウズラ
");
if、elseif... 構造では、1 つのブランチ テスト サーフェスが成功した場合にのみテストが可能になります。理論的には、これは前の例と同じです。 (5 つの分岐を持つネストされた構造の代わりに 5 つの分岐を持つ構造) は構文的には異なりますが、より良いと思われる方の分岐を使用してください。
これまでの章で学習したように、自由に使用できます。 PHP タグを使用すると、必要に応じて HTML モードと PHP モードを切り替えることができます。いずれの場合でも、ページ内に HTML テキストの大きな領域を含める必要があり、動的コードが存在しない場合には非常に便利です。変数を挿入したら、HTML モードに切り替えてテキストに直接含めます。これは、print や echo で送信するよりも簡単で効率的です
それほど明らかではありませんが、この戦略はそれ自体が条件付き構造内でも機能するということです。つまり、PHP を使用して送信する HTML を決定し、一時的に HTML モードに戻すことでその HTML を「送信」できます。
たとえば、次のコードは print ステートメントを使用して完全な HTML Web ページを構築します (テストには Female() ブール関数を想定しています)。