次に、PHPにおける制御構造の書き方について紹介していきます。
最初に紹介する制御構造は、分岐処理です。一般的な言語と同じく、PHPでもif文を分岐処理の表現に用います。その構文も一般的な言語と変わりありませんから、それほど難しく感じないと思います。
if文は、何かの条件を判断して処理を分岐する命令です。したがって、if文を書く場合には、必ず条件を評価するための式が必要となります。この式は、比較演算子(表3)を使って作成され、TRUE(真)かFALSE(偽)で評価されるのです。
| 演算子の例 | 意味 | |
|---|---|---|
| $a==$b | 左辺と右辺の値は等しい | |
| $a===$b | 左辺と右辺の値と型は等しい(PHP4で追加) | |
| $a!=$b | 左辺と右辺の値は等しくない | |
| $a<$b | 左辺より右辺の値が大きい | |
| $a>$b | 左辺より右辺の値が小さい | |
| $a<=$b | 左辺より右辺の値が大きいか等しい | |
| $a>=$b | 左辺より右辺の値が小さいか等しい | |
| 式A?式B:式C | 式AがTRUEの場合式B、式AがFALSEの場合式Cを結果とする | |
| 表3 PHPで利用できる比較演算子 | ||
例えば
if($a==5)
のとき、変数$aの値が「5」の場合、式はTRUEと評価されます。TRUEと評価された場合は、そのすぐあとに続く処理が実行されます。それでは、もしも式がFALSEであった場合にはどうなるのでしょうか。
FALSEであった場合には、次の条件が評価されます。次の条件とは、elseifに続く条件です。このelseifは、不必要ならなくても構いませんし、必要であればいくつでも書いて構いません。
つまり、if文で分岐させる数は、1つでも複数でも自由なのです。もしも、どの条件にもあてはまらない場合には、最後にelse以下に続く処理が実行されます。いずれにしてもif文の最後は、「end if;」で終わらせなくてはなりません。
注意すべきなのは、条件は上から順に評価され、TRUEになると処理を実行して終わってしまうことです。つまり、一度処理を実行すると、次の条件はもう評価されません。したがって、条件を書く順序には十分な注意を払わないと望むような処理を実行できないのです。
もし、どうしても複雑な分岐が必要となる場合には、if文の中にif文を書くこともできます(if文のネスト:リスト7)。if文のネスト数について、特に制限はありませんが、あまり多用するべきではありません。なぜなら、処理が複雑になり、読みにくいプログラムになるからです。
この問題のもう1つの解決方法として、switch文を用いることもできます(リスト8)。switch文は、if文と同じく分岐処理を実現するための命令ですが、1つの変数を対象とするところに違いがあります。その代わりにswitch文では、break命令を発行するまで、次の処理も実行し続ける特徴があります。
<html>
<body>
<?php
/* 処理Aと処理A'が実行される */
$a="mens";
$b=1000;
if($a=="men"){
/* 処理A */
if($b>1000){
/* 処理A' */
end if;
}
}
else{
/* 処理B */
}
end if;
?>
</body>
</html>
<html>
<body>
<?php
/* 処理Aが実行される */
$a="mens";
switch($a){
case "mens":
処理A;
break;
case "ladys":
処理B;
break;
}
?>
</body>
</html>
この特徴は便利なようですが、実際に用いるには、失敗しないよう十分な注意が必要です。なぜなら、switch文では一度TRUEになると、break命令があるまで無条件に実行されるからです(リスト9)。くどいようですが言い換えて表現すると、条件が判断されるのは、switch文全体において一度きりです(リスト10)。
<html>
<body>
<?php
/* 処理Aに続いて処理Bも実行される */
$a="mens";
switch($a){
case "mens":
処理A;
case "ladys":
処理B;
}
?>
</body>
</html>
<html>
<body>
<?php
/* 処理Aが実行される */
$a="mens";
switch($a){
/* このように複数の値に1つの処理を対応させられる */
case "boys":
case "mens":
処理A;
break;
case "ladys":
処理B;
break;
/* defaultは、if文のelseと同じ役割となる */
default:
処理C;
}
?>
</body>
</html>
いずれにしても、複雑なプログラムを書くときにはフローチャートを書くなどして、処理の流れを明確にしておかなくてはなりません。さもなければ、自分が何をどのように処理したいのか、途中で見失ってしまうことでしょう。なんでも表現できるからこそ、慎重に計画して、最も効率のよい表現が必要なのです。
Copyright © ITmedia, Inc. All Rights Reserved.