PHP の値の等価性

このページは、PHP の値の等価性についてまとめる予定のページです。

目次

用語

falsy

if ($x) などで false として判定される値のこと (下記の値)。

  • false
  • 0, 0.0, -0.0
  • 空文字列 ('')
  • '0'
  • 空の配列 ([])
  • null
  • 子要素も属性もない SimpleXML オブジェクト
    (simplexml_load_string(''), new SimpleXMLElement('<x/>'), new SimpleXmlIterator('<x/>') など)

empty()true になる値も上記と同じです。(= !empty(上記の値)(bool)上記の値 は同じ)

等価演算子 (==)

2つの値の型が異なる場合、型変換を行って2つの値が等価かを確認する演算子。

厳密等価演算子 (===)

型変換を行わずに2つの値が等価かを確認する演算子。

等価演算子の例

true になる例
var_dump(null == ''); // -> (string)null == '' -> '' === ''
var_dump(null == 0); // -> (bool)null == (bool)0 -> false === false
var_dump('00000' == 0); // -> (int)'00000' === 0 -> 0 === 0
var_dump('0e0' == 0); // -> (int)'0e0' === 0 -> 0 === 0
var_dump('0e0' == '0'); // -> (int)'0e0' === (int)'0' -> 0 === 0
var_dump('0001' == '1e0'); // -> (int)'0001' === (int)'1e0' -> 1 === 1
var_dump('1234' == ' 1234'); // (※先頭に空白がある数値形式の文字列) -> (int)'1234' === (int)' 1234' -> 1234 === 1234
var_dump([1,2,3] == [1,2,3]);
var_dump([1] == ['1']); // -> [1] === [1]
var_dump(simplexml_load_string('') == 0); // -> (int)simplexml_load_string('') === 0 ?
var_dump(simplexml_load_string('<a/>') == 0); // -> (int)simplexml_load_string('<a/>') === 0 ?
var_dump(simplexml_load_string('<a>0</a>') == 0); // -> (int)simplexml_load_string('<a>0</a>') === 0 ?
PHP 8 未満では true になる例 ※1
var_dump('' == 0); // -> (int)'' == 0 -> 0 === 0
var_dump('a' == 0); // -> (int)'a' == 0 -> 0 === 0

※1 PHP 8 で等価演算子の仕様が変更になったため (文字列と数値の比較のとき、文字列が数値形式の文字列ではない場合数値に変換されない。PHP 8 未満では数値形式の文字列ではなくても数値に変換されていた)

PHP 8 以上では true になる例 ※2
var_dump('1234' == '1234 '); // (※末尾に空白がある数値形式の文字列) -> (int)'1234' === (int)'1234 ' -> 1234 === 1234

※2 文字列同士の比較の場合、2つの値がともに数値形式の文字列ではない場合は通常の文字列比較 ('a' == 'b' などと同じ) になるが、PHP 8 になって数値形式の文字列とみなされる文字列の仕様変更があったため
(数値形式 + 末尾に空白類、のケースが数値形式の文字列とみなされるようになった。PHP 8 未満では先頭に空白類 + 数値形式、のケースのみ数値形式の文字列とみなされていた)

値が 0 か '0' のとき true にする

if ($x === 0 || $x === '0')

値が空文字列のとき true にする

if ($x === '')

値が null のとき true にする

if ($x === null)
if (is_null($x))

関連