はじめに
この記事ではPHPにおけるnullと他の型との比較をまとめます。
先日、nullを含む式が意図しない挙動をしインシデントが発生してしまったので、その際調べたことを主にまとめています。
※この記事では、PHP8を前提にしています。バージョンによって異なる型同士の比較の評価が異なるためご注意ください。
① nullとString型
この場合は、null を "" に変換して数値または文字として比較します。よって以下のような結果になります。
var_dump(null < '0'); // bool(true)
var_dump(null < '1a2'); // bool(true)
var_dump(null < 'こんにちは'); // bool(true)
var_dump(null < ''); // bool(flase)
var_dump(null == '0'); // bool(flase)
var_dump(null == '1a2'); // bool(flase)
var_dump(null == 'こんにちは'); // bool(flase)
var_dump(null == ''); // bool(true)
var_dump(null === ''); // bool(flase)
注意するのはnull < '0'で、文字列'0'は文字列として評価されるためtrueとなることです。nullが「""」(長さ0の文字列)で数値形式ではないことから、文字列同士の比較となります。
オペランドが両方 数値形式の文字列 の場合、 もしくは一方が数値で、もう一方が 数値形式の文字列 の場合、 比較は数値として行われます。 -- PHP: 比較演算子 - Manual
②nullと数値型
この場合は、両辺をbool型に変換して評価します。よって以下のような結果になります。
var_dump(null < 123); //bool(true)
var_dump(null < 0); //bool(false)
var_dump(null < 1.2); //bool(true)
var_dump(null < 0.1); //bool(true)
var_dump(null == 123); //bool(false)
var_dump(null == 0); //bool(true)
var_dump(null == 1.2); //bool(false)
var_dump(null == 0.1); //bool(false)
var_dump(null === 0); //bool(false)
var_dump(null === 0.1); //bool(false)
var_dump((bool)-1); //bool(true)
比較演算子が「===」や「!==」以外の場合は0以外はtrueとなるため、比較演算子が「<」の場合は右辺が0以外の場合はtrueと評価します。
③nullとそれ以外の型
それ以外の型についても数値型との比較と同様で、両辺をbool型に変換して評価します。
ここでは配列とオブジェクトを例に結果を見てみます。
class Cuphead {
public $color = 'red';
}
$array_fruits = ['lemon', 'melon'];
$array_cities = [];
$cuphead = new Cuphead();
var_dump(null < $array_fruits); //bool(true)
var_dump(null < $array_cities); //bool(false)
var_dump(null < $cuphead); //bool(true)
var_dump(null == $array_fruits); //bool(false)
var_dump(null == $array_cities); //bool(true)
var_dump(null === $array_fruits); //bool(false)
なお、配列は空の場合はfalseとなります。
おわりに
PHPではnullの扱いは複雑なので、設計の時点でnullが入らないように考慮するのが無難かなと思いました。