2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

株式会社シンプルウェイAdvent Calendar 2023

Day 9

【PHP】nullを含む式についての評価まとめ

Last updated at Posted at 2023-12-08

はじめに

この記事では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が入らないように考慮するのが無難かなと思いました。

参考サイト

PHP: 比較演算子 - Manual

2
0
0

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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?