0
0

More than 1 year has passed since last update.

PHP で if ($var) と書かれていてよく思考停止する話~ if の動きまとめ

Last updated at Posted at 2022-04-27

tl;dr

if の中には「はい」か「いいえ」で答えられるような表現を書きましょう。


PHP でよく見られる次の書き方。

if ($var) {
    // 何らかの処理
}

これを日本語にすると「もし $var ならば」

・・・何が?🤔

私としては、日本語に直せない if 文の表現は書くべきではないと思っています。
ですが、会社の既存コードにはやむを得ず if ($var) が登場することがあります。
PHP の保守案件に関わったりする場合は、やはり動きを知っておかなければなりません。

if ($var) の動き

下の記事にあるように、if の括弧内に書かれた表現は真偽値 (true または false) として解釈されます。
解釈された結果が true の場合は処理を実行し、false の場合は実行しません。

expression is evaluated to its Boolean value. If expression evaluates to true, PHP will execute statement, and if it evaluates to false - it'll ignore it.

真偽値としての解釈で false になるもの

では、どのような表現が true になり、どのような表現が false になるのか、boolean 型にキャストしながら見ていきます。

false 自身

言うまでもなく false と解釈されます。

var_dump((bool)false);
bool(false)

整数型: 0

真偽値をよく 0 と 1 に置き換えることがありますが、その感覚と同じで 0 は false と解釈されます。

var_dump((bool)0);
bool(false)

浮動小数点型: 0.0-0.0

var_dump((bool)0.0);
var_dump((bool)-0.0);
bool(false)
bool(false)

文字列型: "" (空の文字列) と "0"

文字列の "0" は、文字列としては空でないのに false と解釈されるので注意です。

var_dump((bool)"");
var_dump((bool)"0");
bool(false)
bool(false)

配列型: 要素を持たない配列 array(), []

var_dump((bool)array());
bool(false)

NULL 型

var_dump((bool)null);
bool(false)

未定義の変数・unset された変数

var_dump((bool)$a);

$b = 1;
unset($b);
var_dump((bool)$b);
bool(false)
bool(false)

子要素を持たない要素から作られた SimpleXML オブジェクト

$menu = simplexml_load_string('<menu></menu>');
var_dump($menu);
var_dump((bool)$menu);
object(SimpleXMLElement)#1 (0) {
}
bool(false)

真偽値としての解釈で true になる意外なもの

true と解釈されるもののうち、要注意だと思うものをいくつか列挙します。

整数の -1

var_dump((bool)-1);
bool(true)

文字列の "false"

var_dump((bool)"false");
bool(true)

子要素が子要素をもたない SimpleXML オブジェクトの子要素の方

dish は子要素を持たないのですが、true と解釈されます。

$menu = simplexml_load_string('<menu><dish></dish></menu>');
var_dump($menu->dish);
var_dump((bool)$menu->dish);
object(SimpleXMLElement)#2 (0) {
}
bool(true)

if の中には「はい」か「いいえ」で答えられるものを書きましょう

この記事は if の仕組みを理解するための記事ですが、決して if の中に変数をそのままぶち込むことを推奨するものではありません。
パッと見わかりにくい暗黙的な書き方を多用していては、初学者や非 PHP エンジニアの方が入る余地がなくなってしまいます。

if は「もし~ならば」と訳されるものですから、「~」には「はい」か「いいえ」で答えられるものを書くか、変数名を工夫することをおすすめします。

// $var は整数の 1 ですか?
if ($var === 1)

// 文字列 '1' は配列 ['1', '2', '3'] の中に存在しますか?
if (in_array(['1', '2', '3'], '1', true))

// Taro はリンゴを好きですか?
if ($taroLikesApple)

// お店は開いていますか?
if ($shop->isOpen())

// 「何らかの処理」は成功しましたか?
$onSuccess = 何らかの処理();
if ($onSuccess)
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0