PHP-制御構造
- 制御構造に関する公式ドキュメント
・要件(前提条件、使用環境)
・PHPが導入済み
・VSコードを導入済み
・dockerを導入済み
・Xdebugが導入済み
・Composerが導入済み
- 前提知識
・$変数名= 値;
・$変数名= 式; 値をもつもの
・文は末尾に「;」がついたもの、もしくは中括弧で囲まれたもの
・構文は文法・書式のこと。
・Syntax error とは、構文エラーという意味
・言語構造は、言語を構成する要素のこと( PHPのキーワード )
・制御構造は、プログラムの流れを制御するもの。言語構造の一種 - 条件分岐
2-1. if
比較演算子で真偽値で判定、論理型変数で直接判定、暗黙的変換し判定、複数条件で判定
2-2.switch
同じ変数を複数の値で条件分岐したいときに使う
※注意 緩やかな型変換される
2-3.match
同じ変数を複数の値で条件分岐し、値を代入したいときに使う
※厳密な比較で処理される
3.繰り返し処理
- foreach
配列の全要素に対して繰り返しで使う
※開発でよく使うことがある
$nummer[1,2,3,4]
foreach () {
echo $number *2 . PHP_EOL;
} // 2 4 6 8
- for
決められた回数分の繰り返し処理
for ($i = 1; $1 <= 10; $++) {
echo $i;
} //1 2 3 ...10
- while
ある条件を満たす間だけ繰り返す
$i = 0;
while($i < 100){
i +1;
}
- breakとcontinue
breakはループを抜けたいときに使う
continueはループをスキップしたいときに使う
- HTMLと混ぜて使うとき
if,switch,foreach,for,whileには波括弧を使わない記法が存在する
<?php if ($num === 10) { ?>
<p>$numは10</p>
<?php } ?>
⬇
<?php if ($num === 10) : ?>
<p>$numは10</p>
<?php endif; ?>
3. コードの順番
- コードの順序に依存性がある時は、依存性が明確にする
- コードの順序に依存性がない時は、関連するコードをまとめる
- コードを上から下に読みやすくする
4. 条件分岐
- 正常なケースを先に書き、エラーケースをあとに書く
- else句が必要かどうかよく確認する
※海外の論文によると、50%の割合でelse句が必要になる場合ある
$myasqli = mysqli_connect();
if() {
}
- 複雑なif-elseifの場合
- 複雑な条件式は関するにする
- 一般的なケースを最初に書く
if(isLetter($inputName)){
}
- switch 文でcaseがたくさん登場するときは、caseの順番に気をつける
- 順番
+ 正常なケースを先頭にする
+ よく登場するものから記載する。
+ アルファベット順や数値順に書く
- その他
+ 全てのケースを網羅する
+ defalut句はその他扱いの時に指定する
+ 各ケースの処理は関数は使ったりして短くして書く
5. 繰り返し処理
-
foreach
配列の全要素に繰り返し処理をする -
for
決まった回数だけ繰り返し処理をする -
while
繰り返し処理を何回したいかわからない時使用する -
繰り返し処理のポイント
複雑になりやすいため、単純にする
- 開始
+ 初期化コードはループの直前に置く
+ 無限ループにはwhile(ture)を使う
- 本文
+ ループのネストは3段階まで
+ ループの前処理・後処理は先頭か末尾にまとめる
例)ループの回数を数えたい時
+ ループ1回に1つの機能(処理)
+ ループは20~50行以内にする
- 終了
+ 全てのケースでループが終了することを確認する
+ ループの開始時と終了時をシュミレーションする※(脳内・紙に書く) -
繰り返し処理のコツ
ループは内から外へ書くと混乱しにくい
- 日本語で本文の処理を書く
- コードに置き換える
- ループで囲む
- 変数の初期化等を追記する
<?php
6. 制御構造によくある問題
- 複雑な式
- ブール変数やブール関数を使ってシンプルにする
<?php
- 否定的な論理式
- 否定的な理解は時間がかかるため、肯定的な論理式にする(迷ったらド・モルガンの法則を使う)
<?php
-
括弧のない複雑な論理式
- 複雑な論理式は括弧を使うと意味が明確になる -
数値を含む式
- 数値を含む式は数直線上に並べる -
深いネスト
- 深いネストはコードが読みにくいので、2~3段階までにする
複雑さの測定
- 初期値は1
- if,for,while,&&,|| が登場するたびに1を足す
- case の選択肢ごとに1を足す
⬇ - 1~5 個:処理は適切
- 6~10個: 単純にできないか検討
- 11個~ :処理の一部を関数に分割