今日はPHPの制御構造について学んでいきたいと思います。
目次
- 前説
- 条件分岐
- 条件分岐の概要
- if文
- if文の例外処理
- if / else if / else のネスト
- switch文
- ループ
- ループの概要
- forループ
- whileループ
- foreachループ
- 結論
プログラミングで必ず使用する制御構造とは、条件分岐、ループ、、他にも色々あるようです。
ですが、条件分岐とループだけ最低限覚えておきましょう。この2種類以外は意識して覚える必要はないと思います。
その他の条件分岐
- break
- continue
- declare
- return
- require
- include
- require_once
- include_once
- goto
興味がある方はGoogleで検索してみましょう。
条件分岐
まず初めに、条件分岐から理解していきましょう。
クルマを運転していると信号に出会いますよね。
信号が赤だったらどうしますか?止まりますよね。
信号が青だったらどうしますか?進みますよね。
このように条件によって動きを変えるのが条件分岐です。
プログラムにして書いてみます。
<?php
if ($信号 == "赤") {
echo "止まる";
} else if ($信号 == "青") {
echo "進む";
}
?>
これが条件分岐です。信号の状態を判断し、動作を変えるのです。
信号は、赤・青以外に黄色もありますね。黄色の場合も処理を追加してみます。
黄色は、基本的には「止まる」のが正しいそうです。
<?php
if ($信号 == "赤") {
echo "止まる";
} else if ($信号 == "青") {
echo "進む";
} else if ($信号 == "黄") {
echo "止まる";
}
?>
このように、else ifを使用して、分岐する条件を追加することができます。
では、赤でも青でも黄でも無い場合はどうしましょうか?
プログラマーは、正常な状態以外のことも考えてプログラミングをするものです。
ここでは、こうしましょう。
<?php
if ($信号 == "赤") {
echo "止まる";
} else if ($信号 == "青") {
echo "進む";
} else if ($信号 == "黄") {
echo "止まる";
} else {
throw new Error("信号が故障しています");
}
?>
elseを追加しました。赤でも青でも黄でもない場合、信号は壊れていますよね。
現実では、あり得ないことですが、あり得ないことを想定しておくことができるのも、良いプログラマーの条件だと思います。
あ、throwは「例外」という仕組みです。これは、また別の機会に説明します。
elseは、それ以外の場合。という使い方をします。
if / else if / elseはネストさせることができます。
このような使い方です。
<?php
if ($信号 == "赤") {
echo "止まる";
} else if ($信号 == "青") {
echo "進む";
} else if ($信号 == "黄") {
if ($停止線 == "超えている") {
echo "進む";
} else {
echo "止まる";
}
} else {
throw new Error("信号が故障しています");
}
?>
信号が黄の場合の分岐に、条件を追加しました。
停止線を超えている場合は、安全に停止することができないため、そのまま進む。
停止線を超えていない場合は、止まる。
いかがでしょうか。if文はこのように使います。難しい場合は、何度か読み返し、別の条件で考えてみるのも良いでしょう。
例えば、寝る時間や、週末など身近なことを、ソースにしてみると良いでしょう。
もう一つの条件分岐
if文の使い方について説明しました。もう一つの条件分岐があります。
switch文です。理解しやすいように、全く同じ信号の条件分岐をswitch文で書いてみます。
<?php
switch ($信号) {
case "赤":
echo "止まる";
break;
case "青":
echo "進む";
break;
}
?>
最初のif文と全く同じ動作をするソースになっています。
switchの特徴は、breakが必要だということです。
breakを書かない場合は、その下のcaseのブロックも動作することです。
たまに、あえてbreakを書かないテクニシャンもいますが、そんな書き方はやめましょう。
バグの原因でしかないと思います。
同じく黄も条件に追加してみます。
<?php
switch ($信号) {
case "赤":
echo "止まる";
break;
case "青":
echo "進む";
break;
case "黄":
echo "止まる";
break;
}
?>
問題ないですね。
さて、elseにあたる部分を追加します。
<?php
switch ($信号) {
case "赤":
echo "止まる";
break;
case "青":
echo "進む";
break;
case "黄":
echo "止まる";
break;
default:
throw new Error("信号が故障しています");
}
?>
switch文の場合は、defaultのラベルが、「それ以外」という動きをします。
もちろんswitch文もネストさせることができます。
<?php
switch ($信号) {
case "赤":
echo "止まる";
break;
case "青":
echo "進む";
break;
case "黄":
switch ($停止線) {
case "超えている":
echo "進む";
break;
default:
echo "止まる";
break;
}
break;
default:
throw new Error("信号が故障しています");
}
?>
ネストさせる場合でも、breakは忘れずに書きましょう。
条件分岐は、この2つを理解できていればOKです。
次はループを見てみましょう。
ループ
ループの制御構造は、処理を繰り返し行いたい場合に使用します。
ループの制御構造は、for / while / foreachの3つを覚えれば十分です。
他にdo-whileというものもありますが、興味のある方は調べてみてください。
私は雪国に住んでいるので、冬になると車のタイヤを交換します。
車のタイヤは、4個ありますね。同じことを4回繰り返す必要があります。
これをプログラムにしてみましょう。
for ($i = 0; $i < 4; $i++) {
echo "タイヤを外す";
echo "冬用のタイヤに交換する";
}
このくらいしかないか。。
この書き方は、forループというものです。
forの書き方は、このように決まっています。
for (初期化; ループ条件; ループ後の処理) {
}
この書き方を、タイヤの交換プログラムに当てはめてみます。
- iを0に初期化(最初だけ実行される)
- iが4より小さいか判定
- タイヤを外す
- 冬用のタイヤに交換する
- iをカウントアップ(0が1にカウントアップされる)
- 2の判定に戻る
このように動作します。結果4回のループ処理を行い、ループ処理を抜けて終了します。
慣れるまでは、初期化した変数が、ループ条件の値よりも小さい場合に、ループ処理を行い、一回のループ処理が終わったら、初期化した変数をカウントアップして繰り返す。
と覚えておくと良いでしょう。たまにカウントアップ以外のことを、「ループ後の処理」で行うケースもありますが、
まずは、カウントアップして使うものだと覚えておくと良いでしょう。
次は、whileループを見てみます。同じくタイヤの交換をwhileループで書いてみます。
$i = 0;
while ($i < 4) {
echo "タイヤを外す";
echo "冬用のタイヤに交換する";
$i++;
}
whileループで書くとこのようになります。forループと比べるとシンプルに見えないですか?
やっていることは全く同じです。当然動作も同じ動きをします。
全く同じだったら、どちらかを覚えれば良いのではないかと思いますか?
そんな気がしないでもないです。
慣れてくると、この場合はforだ。その場合は、whileだなと自分で選択できるようになります。
このように考えると判断しやすいと思います。
ループ回数が決まっている、分かっている場合
forループを使う
ループ回数が確定しておらず、条件を満たす回数が不明の場合
whileループを使う
ループ回数が確定しない場合の処理も考えてみます。
$loop = true;
while ($loop == true) {
echo "腰のコリをほぐす";
if (腰のコリはほぐれたか?) {
$loop = false;
}
}
いまいち良い現実が見えなかったので、腰痛の場合をプログラムにしてみました。
腰のコリは、何回ほぐしたら、ほぐれるのかなんて分からないので、ループの処理内で判定し、ループの条件である、$loopを変更する方法にしました。
$loopがfalseになった場合にwhileループは終了します。
whileループを使う場合は、必ずループを抜ける処理を入れましょう。
これを忘れると、ループが終わらないということになります。*フリーズとか、無限ループという状態ができます。
無限ループは、forループでも起こります。
ループは必ず、ループを抜ける条件が書かれていることを確認して動かしましょう。(テストしましょう。)
最後に、foreachループです。このループは、配列に対して使うループです。
配列の要素を順番に処理する場合に使用します。
プログラムを書いていると、配列を扱うことが非常に多いです。
そのためforeachを使う頻度も多いため、foreachも必ず理解しましょう。
早速プログラムを書いてみます。これもタイヤ交換をプログラムにしてみます。
$tires = [0, 1, 2, 3];
foreach ($tires as $tire) {
echo "タイヤを外す";
echo "冬用のタイヤに交換する";
}
これもシンプルですよね。配列の全部の要素に対してループ処理を行いたい場合は、foreachを使いましょう。
foreachの書き方は、こちらです。
foreach (配列 as 要素) {
}
まず$tiresにタイヤの配列を用意します。(4本のタイヤがあるという配列とみなして)
この書き方だと、最初のループでは、「0」が最初の要素として$tireにセットされます。
次のループは「1」、次が「2」。。。という動きをします。
一応forループの場合のプログラムも書いておきます。
for ($i = 0; $i < count($tires); $i++) {
echo "タイヤを外す";
echo "冬用のタイヤに交換する";
}
countという命令を使って$tiresに、何個の要素があるかを取得しています。
3種類のループを紹介しました。それぞれ状況によって使い分けられるようになると一つレベルアップしたということです。
とりあえず、このように覚えておくと良いでしょう。
ループ回数が決まっている、分かっている場合
forループを使う
ループ回数が確定しておらず、条件を満たす回数が不明の場合
whileループを使う
ループの対象が配列変数の場合
foreachループを使う
この条件分岐と、ループさえ理解できれば次のステップに進んでも大丈夫です。
プログラミングには、この制御構造が非常に大事です。この理解がないと何も理解できないというくらい重要なことです。
繰り返し、勉強して反復して、プログラマーを目指す初心者の方は必ず身につけてください。
基本のキ。プログラマーのプ。
ですね。