PHP学習のススメ 第3回:制御構造を覚えよう
Dreamweaverl CC (2013年06月公開) 対応
この連載ではPHPそのものの紹介というよりは「PHPを学習するためには、どんな準備が必要か」という部分に焦点を当て紹介していきたいと思います。PHPの入門書籍を読み始める前に、ぜひ本連載で準備を整えてください。
英語を学ぶ場合、単語を覚えることはもちろん必要ですが、それ以上に「文章を組み立てる力」を身につけることが重要です。それと同様に、プログラムを学ぶ場合もファンクション(=単語)を学ぶのと同時に、組み立て方を学ぶ必要があります。プログラムではこれを「制御構造」と呼びます。
例えば、次のようなプログラムを見てみましょう。
「現在の時刻が18時以前だった場合は問い合わせ電話番号を表示し、18時以降だった場合は携帯電話番号を表示する」
左が18時以前の表示、右が18時以降の表示
お店のWebサイトなどで、時間帯によってサポートの電話番号が変わる場合を想定しています。この場合、プログラムは呼び出される時間によって動きが変化します。これが「制御構造」の役割です。
3つの制御構造
上図の例文のプログラムは「選択」という制御構造で作ることができます。PHPに限らず、プログラム全般では、制御構造を3つに分類することができます。
順次
プログラムは通常、上の行に書かれたプログラムから順に動きます。例えば、次のようなプログラムの並びの場合は、1、2の順で動作します。
<?php date_default_timezone_set(‘Asia/Tokyo’); //1 echo date(‘Y-m-d’); //2 ?>
素直な動きです。
選択
ある「条件」に従って、プログラムを動かすものと動かさないものを「選択」することができます。先の例のように、18時以前と以降で表示するものが違うなどという場合です。
繰り返し
ある「条件」を満たすまで、同じプログラムを動かし続けることができます。例えば、図2のような日付を並べたリストを表示する場合、「末日まで、繰り返し日付を表示する」といったプログラムを作ることができます
こうした日付リストは、「末日まで、繰り返し日付を表示する」といったプログラムで実現できます
この3つの制御構造だけで、どんな複雑なプログラムでも作ることができます。まずは、この種類を覚えておきましょう。
制御構造のブロック
それでは、先の電話番号の表示切り替えを実際にPHPで作ってみましょう。連載1回目を参考に、開発環境を整えておいてください。HTMLの基本タグを記述したら、次のようなプログラムを作ります
<?php date_default_timezone_set(‘Asia/Tokyo’); if (date(‘H’) < 18) { ?> <p>03-9876-xxxx</p> <?php } else { ?> <p>090-1234-xxxx <夜間専用></p> <?php } ?>
実際に動作させてみると、時間帯によって表示される電話番号が変化することがわかります。次の数字の部分を変えてみるとよいでしょう。
if (date(‘H’) < 18) {
ここでは、「if」という選択の制御構造を使いました。書式は次のようになります。
if (条件) { 条件に合ったときのプログラム } else { 条件に合わなかったときのプログラム }
ここで、注目するのは中括弧(または、波括弧)です。最初の中括弧から最後の中括弧の範囲が、if構文のブロックとなります。if構文では、条件にあった場合のプログラムを、複数行記述することができます。そこで、if構文全体を中括弧で囲んでその範囲を示すのです。
Dreamweaverでは、中括弧を閉じ忘れると、図3のように赤のマーカーで警告してくれます。ただし、指す場所が少しわかりにくく、なぜエラーになっているのかがわからないことがあります。間違いを防ぐには、次のようなことに気をつけるとよいでしょう。
Dreamweaverでは、中括弧を閉じ忘れがあると、赤のマーカーで警告してくれます
閉じ括弧の忘れを防ぐには、下図のように先に閉じ括弧まで書いてしまうのがオススメです。その後、カーソルを括弧の中に戻して内容を書いていくとよいでしょう。
閉じ括弧を先に書いてしまう
インデントを入れよう
もう1つ、身につけたいのが「インデント」です。括弧内のプログラムは、タブ記号や空白で行頭に余白を入れると、括弧の関係性が明確になります。Dreamweaverを利用した場合、インデントは自動的に挿入されます。
プログラムが複雑になると、ブロックが入れ子になって非常にややこしくなります。ぜひ、早い段階でキレイなプログラムを書けるようにしておきましょう。
もう1つのブロック
中括弧を使ったブロックは、PHPをはじめ、JavaScriptなど多くのスクリプト言語で使われています。しかし、入れ子が続くと非常にややこしくなるため、初心者には最初の壁になりがち。そこで、PHPにはもう1つブロックを作る方法が準備されています。
if (条件): 条件に合ったときのプログラム else: 条件に合わなかったときのプログラム endif;
はじめをコロン(:)として、最後を「endif」で終わらせます。これなら、「何を閉じたいのか」が明確なため、わかりやすいプログラムになります。どちらを使っても構いませんが、筆者はこの方法がオススメです。
条件の書き方
条件には、「はい」または「いいえ」で答えられる質問を書きます。例えば、ここでは以下のように記述しました。
date(‘H’) < 18
「date(‘H’)」は現在の時間を24時間制で取得できます。「<」は算数の不等号と同様です。つまりここでは、「現在の時間が18未満であるか」という条件になっています。ここは、結果が同じになればどんな書き方もできます。
18 > date(‘H’) あるいは date(‘H’) <= 17
では、どの書き方が一番よいのでしょうか? そんなときは、次のことに気をつけましょう。
日本語として自然か?
例えば、次の条件を見てみます。
18 > date(‘H’)
これを、日本語で言えば「18が現在の時間より上か?」となります。一瞬、何を判断したいのかが理解できません。それは、この条件の主役が「現在の時間」であるため、その主役が文章の後半にあると意味が掴みにくいのです。
では、次の条件はどうでしょう?
date(‘H’) <= 17
これは、「現在の時間が、17以下か」となります。これだと、17:30は含まれるのか含まれないのか、一瞬ではわかりません。
今回の条件は、「18時より前か?」を知りたいので、次の条件が一番素直と言えます。
date(‘H’) < 18
このように、プログラムを読んだ時にすんなり理解できるかを重視して組み立てるとよいでしょう。
制御構造のバリエーション
「選択」の制御構造には、ifの他にもswitchやelseifなどがあります。学習していると、なぜたくさんの種類があるのか、どのように使い分けるのかがわからなくなります。実はこれらは「バリエーション」であって、必ず使わなければならないものではありません。
すべての「選択」の制御構造は、if構文だけで表すことができます。例えば、次のようなプログラムを考えてみましょう。
- 今が、8時なら「おはようございます」と表示
- 今が、12時なら「こんにちは」と表示
- 今が、18時なら「こんばんは」と表示
これを、先の知識で組み立てると、次のようになるでしょう。
if (date(‘H’) == 8): echo ‘おはようございます’; endif; if (date(‘H’) == 12): echo ‘こんにちは’; endif; if (date(‘H’) == 18): echo ‘こんばんは’; endif;
しかし、これだと同じようなプログラムが並んでしまい、あまり美しいとは言えません。そこで、「switch」を使うことができます。
switch(date(‘H’)): case 8: echo ‘おはようございます’; break; case 12: echo ‘こんにちは’; break; case 18: echo ‘こんばんは’; break; endswitch;
こうすれば、スッキリとプログラムを書くことができます。switchはこのように、同じ要素に対して「この場合、この場合」と複数の選択肢がある場合に便利な構文です。
バリエーションの構文はプログラムをスッキリとさせたり、効率よく動作させるためにあります。しかし、ifだけを使った場合でも同じプログラムは作ることができます。もし何を使ったらよいか悩んだときは、基本の「if」で組み立ててみましょう。
なお、ここでは触れませんでしたが、「繰り返し」の構文も「while」という構文が基本になり、バリエーションとして「for」や「foreach」があります。
制御構造をしっかり学んで、プログラムを自在に組み立てられるようになりましょう。