おぼえがき

過ちては則ち改むるにうんぬんかんぬん

if文とelseifとelseと比較演算子について(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1におけるif文について。

<?PHP

echo '数字を入力してください。 >';
$number = trim(fgets(STDIN));


//①if文のパターンA
if ($number > 100) {
  echo '100よりも大きいです!!';
elseif ($number > 10) {
  echo '10よりも大きいです!';
else {
  echo '10よりも小さいです…。';
}


//②if文のパターンB
if ($number > 100):
  echo '100よりも大きいです!!';
elseif ($number > 10):
  echo '10よりも大きいです!';
else:
  echo '10よりも小さいです…。';
endif;

特定の戻り値(返り値)に対応した処理をしたい場合は、if文を使います。

 

if文は以下の定形を用いた複数分岐のプログラムです。

 

●2つに分岐するパターン

if (条件分岐①) {
  条件分岐①を満たしたときにおこないたい処理;
} else {
  条件分岐①を満たさない場合におこないたい処理;
}

 

●3つ以上に分岐するパターン

if (条件分岐①) {
  条件分岐①を満たしたときにおこないたい処理;
elseif (条件分岐②) {
  条件分岐②を満たしたときにおこないたい処理;
} else {
  条件分岐①と②を満たさない場合におこないたい処理;
}

 

AかBかの2択の分岐でいい場合はelseifは使いません。

3択以上の分岐を作りたい場合にのみ、その分岐の数に応じてelseifを記述します。

 

1つのif文のなかにifとelseとendifは1回しか記述できませんが、elseifは2回以上記述することが可能です。

 

 

また、if文の条件分岐の部分には比較演算子を使います。

代表的な比較演算子は以下のとおりです。

 

●比較演算子の一覧

== =!<> データ型を除いて等しい
=== !<> データ型も含めてすべて等しい
!== =<> データ型を除いて等しくない
<> =!== 同上
!== =<> データ型も含めてすべてが等しくない
< ==!<> より少ない
> ==!<> より大きい
<= =!<> より少ないか等しい
>= =!<> より大きいか等しい
<=> ==! ???

 

 

また、上記のようにif文には2つの記述方式が用意されています。

①のブラケットを使うパターンでも②のコロンを使うパターンでも、if文としての挙動や処理自体はまったく同じです。

 

 

if文の入れ子(ネスト)について。

<?PHP

echo '数字を入力してください。 >';
$number = trim(fgets(STDIN));

if ($number >= 100) {
  if ($number == 100) :
    echo '100ぴったりです!';
  else :
    echo '100よりも大きいです!!';
  endif;
elseif ($number > 10) {
  echo '10よりも大きいです!';
else {
  echo '10よりも小さいです…。';
}

上記のように、if文はif文の中に新しく記述していくことも可能です。

これはif文の入れ子やネスト(nestingの略)などと呼ばれます。

 

ネストの場合、上記のプログラムのように、if文の条件分岐①を満たしたパターンでありなおかつ追加の条件分岐①-aを満たしたパターンの処理および条件分岐②-bを満たしたパターンの処理、などという複数の分岐を作ることも可能です。

 

しかしネストは、はっきりいって見づらいのでif文の記述方法としてはあまり推奨されていません。

なにか特別な理由がない限りは、複雑なif文はネストではなくelseifを使って記述していくことが推奨されています。

 

 

if文でelseifを使って複数の条件を満たしたパターンの処理をする方法について。

<?PHP

echo '数字を入力してください。 >';
$number = trim(fgets(STDIN));

if ($number >= 100 && $number == 100) {
  echo '100ぴったりです!';
elseif ($number >= 100) {
  echo '100よりも大きいです!!';
elseif ($number > 10) {
  echo '10よりも大きいです。';
else {
  echo '10よりも小さいです…。';
}

上記のプログラムのように、if文では条件式に論理演算子を記述することで複数の条件を設定することが可能です。

 

 

論理演算子には、以下のようなものがあります。

 

●論理演算子の一覧

and :両方がtrueの場合にtrue
&& :andと同じ
or   :どちらか片方がtrueの場合にtrue(両方trueでも可)
||  :orと同じ
xor  :どちらか片方がtrueであり両方がtrueでない場合にtrue
!a    :aがfalseの場合にtrue(aは論理演算子ではなく値です)

 

 

上記のようにandと&&、そしてorと||は同じ処理となっています。

しかし慣習として、C言語からの名残りで&&と||のほうが実際の現場ではよく使われる傾向にあるようです。

 

 

なお、各論理演算子の優先順位は以下のようになっています。

 

&& > || > and > xor > or > !

 

 

論理和(orまたは||)演算子を使う際の注意点について。

<?PHP

$gender = '女性';
$age = 21;

//①orの挙動がバグを生むパターン
if ($gender == '男性' && $age == 20 || $age == 21) {
  echo '男性で20歳か21歳ですね?';
}


//②バグがないパターン
if ($gender == '男性' && ($age == 20 || $age == 21)) {
  echo '男性で20歳か21歳ですね?';
}

複数の条件式の中で論理和演算子を使う際は、バグを生まないように注意して使う必要があります。

 

 

上記のプログラムは、それぞれ以下の出力結果となります。

 

①の出力結果

男性で20歳か21歳ですね?

 

② 出力結果

なし

 

 

ご覧のように、パターン①では$genderの変数の値があきらかにif文の条件式に対してfalseとなる値であるにもかかわらず、なぜか文字列が出力されています。

このようなバグを防ぐためには、パターン②のように論理和演算子の部分を括弧で囲んでやる必要があります。

 

括弧で囲うことで、上記のような論理和演算子の意図しない挙動を阻止することができます。

 

 

以上です。