PHPの制御構文の中でおそらく最も使うのが条件分岐のifでしょう。
条件分岐のif文
ifはもし~であれば○○を実行するという条件に基いた処理を行う構文です。
基本構文は以下の通りです。
if文の基本構文(if~else if~else)
if(論理値①){
①が真のときの処理
}else if(論理値②){
②が真のときの処理
}else{
それ以外のときの処理
}
先頭から順番に論理値①②…と評価していき、条件を満たす(値が真)処理の部分のとこか1か所に入って処理されます。
論理値部分のif()は必須で、else if()は②③④…と無限に繰り返しできます。
elseは無くてもかまいません。
if文のサンプル
//具体例
$weight = 70; //現在の体重(Kg)
if($weight > 70) { //70Kgより多い場合
echo "体重{$weight}Kgは太りすぎです" . PHP_EOL; //①
}else if($weight > 65){ //65Kgより多い場合
echo "体重{$weight}Kgはやや太りぎみです" . PHP_EOL; //② →ここが実行される!
}else if($weight <= 55){ //55Kg以下の場合
echo "体重{$weight}Kgはやせすぎです" . PHP_EOL; //③
}else { //それ以外の場合
echo "体重{$weight}Kgは標準です" . PHP_EOL; //④
}
この例では②が実行されます。
処理が一行のときの中括弧{}の省略は非推奨!
処理が一行だけのときには中括弧{}は省略できますが、こういった範囲が見えづらい記述方法はバグが発生しやすく、現場で非常に嫌われる傾向にあるので絶対にやめておいたほうがよいでしょう。
//結果は同じでも{}を省略するのはやめましょう!
$weight = 70; //現在の体重(Kg)
if($weight > 70)
echo "体重{$weight}Kgは太りすぎです" . PHP_EOL;
else if($weight > 65)
echo "体重{$weight}Kgは太りぎみです" . PHP_EOL;
ifでand「&&」やor「||」を使って複数条件で評価する
if(評価式)の式の部分には複数の条件の組み合わせが使えます。
複数条件で使う論理演算子
以下の論理演算子をつかってAかつBや、AもしくはBなどの複数条件を構築していきます
A && B | AがtrueかつBがtrueなら全体がtrue | どっちもtrue |
A and B | &&と同じ | |
A || B | 式1がtrueまたは式2がtrueなら全体がtrue | どちらかがtrue |
A or B | ||と同じ |
基本のサンプル
$point = 5;
if($point > 0 && $point < 10) { //$pointが0より大きい、かつ10より小さい場合
echo "ポイントは0点より大きく10点より小さい" . PHP_EOL; //→5点で条件に一致するので出力される
}
論理演算子のルール
基本、式は左から順に評価されていきます。算数の計算どうよう()をつけていくことでグルーピングして優先順位をコントロールできます。
(式1 || 式2)の評価はどちらかがtrueであればよいので、式1がtrueの場合は式2は実行されず、途中で比較が終わります。
具体例を示しますね。
()でif文の複数条件をグルーピングするサンプル
$point = 5;
if(
($point > 0 && $point < 10) //条件① $pointが0より大きい、かつ10より小さい場合
|| ($point <= 0 || $point >= 10) //条件② $pointが0以下、もしくは10以上の場合
) {
echo "ポイントは0点より大きく10点より小さい" . PHP_EOL; //→5点で条件に一致するので出力される
}
この例では条件①か②の条件を満たせばよいので①がtrueになるので出力されます。②は評価すらされず無視されてしまいます。
if文での条件否定「!」
作った条件を逆転させたいときは値の前に「!」記号をつけます。
そうすることでtrue→false、false→trueに逆にすることができます。
if(!true){ //trueの否定なのでfalseと評価される
echo "条件①に入りました" . PHP_EOL;
}else{
echo "elseに入りました" . PHP_EOL;
}
if文でnullになったら?
if文の条件式ではtrue/false以外の値には暗黙が変換がなされあいまいに評価されます。
PHPはさまざまな場面で以下のような暗黙の変換がなされるので必ず覚えておきましょう。
値 | 論理値 | コメント |
null | false | nullはfalse |
0 | false | 0はfalse |
0.0 | false | |
5 | true | 0でない数はtrue |
-5 | true | 0でない数はtrue |
” | false | 空文字はnull扱いでfalse |
‘0’ | false | 数字の0に変換できるのでfalse |
‘あいうえお’ | true | 通常の文字列はtrue |
‘false’ | true | 注意!true/falseは変換されない。通常の文字列扱い |
array() | false | 空の配列はnull扱い |
if文を一行で省略して書く
if文の一行省略法① 条件演算子(3項演算子) ?:
PHPにはif文で行うような処理を1行で書くためによく利用される条件演算子(別名:3項演算子)というを使った構文があります。
条件演算子(3項演算子) ?:の基本構文
式1 ? 式2 : 式3
式1が真のとき式2を返し、偽なら式3を返します。
エクセルのIFに似ていますね。
単純にif文の省略ではなく、「値を返す」条件分岐です。if文で値を振り分けて代入や出力するような処理に利用使えます。
次の2つは同じ結果になります。
条件演算子(3項演算子) ?:のサンプル
//条件演算子を使った例
$is_true = true;
echo ($is_true) ? "○" : "×"; //○が出力
//ifを使った例
$is_true = true;
if($is_true){
echo "○"; //ここが出力
}else{
echo "×";
}
if文の一行省略法② 条件演算子(3項演算子)の省略形式
条件演算子(3項演算子)の記述をさらに省略することができます。
基本構文はこうです。
条件演算子 ?:の省略の基本構文
式1 ?: 式2
式1がtrueに変換できる場合は式1の値を返し、そうでない場合は式2を返します。
条件演算子 ?:の省略のサンプル
$info = "お知らせが1件あります";
echo ($info ?: "お知らせはありません") . PHP_EOL;
これは$info文字列なので暗黙の変換が適用されtrue扱いになります。そこで$infoの内容が出力されるといった形です。
データ型の章でも説明していますが、文字列や0以外の整数など様々なものがtrue扱いになることをうまく使います。
booleanからの変換を確認したい方はこちら
if文の一行省略法③ null合体演算子(??)
式1がnullならば式1、nullでないなら式2を返します。ここでいうnullは厳密なnullで厳密な等価演算子の===でのnullです。あいまいな等価演算子の==でnullとされる0や空文字、falseや空配列はnullと判定されません。
null合体演算子(??)の基本構文
式1 ?? 式2
null合体演算子(??)のサンプル
var_dump(0 ?? "nullだよ") . PHP_EOL; //0はnullじゃない
var_dump(false ?? "nullだよ") . PHP_EOL; //falseはnullじゃない
var_dump(array() ?? "nullだよ") . PHP_EOL; //array()はnullじゃない
var_dump(null ?? "nullだよ") . PHP_EOL; //nullだよ が出力
出力結果
int(0)
bool(false)
array(0) {
}
string(10) "nullだよ"
※null合体演算子が使えるのはPHP7からです。
以上、if文の一行省略して書く3つの方法を紹介しました。
が、コードを少し短くしたり、過度に正規化するよりも、誰もが理解できるわかりやすいソースコードを書くことのほうがが重要です。
これらの方法はちょっとクセのある学習コストの高い記述方法ではあるので現場のPHP使いが全員理解しているわけではないと思います。
実際の使用は、できるだけ方法①の3項演算子程度の使用にとどめておいた方がよいかもしれません。
コメント