PHPのcount関数でnullはどうなる?注意点と安全な書き方を解説

[PR]

PHP

PHPで配列の要素数を取得するcount関数は非常によく使われますが、nullが渡されたときの挙動を正しく理解していないと、予期しないエラーや警告につながることがあります。この記事では、nullを引数とした場合のcount関数の仕様変更、安全な書き方、よくある間違いなどを深く掘り下げます。最新のPHPバージョンでどう扱われているかを踏まえて、開発者として押さえておくべきポイントを整理します。

PHP count 関数 null の挙動と仕様

まずはPHPでcount関数を呼び出したときに、引数がnullであった場合どのような挙動を示すかを、仕様の観点から詳細に説明します。PHPのバージョンによって挙動が異なるため、どのバージョンでどの挙動になるかを正しく知っておくことが重要です。

PHP 7.2〜での変更

PHP 7.2.0以降、count関数に配列でもCountableインターフェースを実装していない型(文字列、数値、nullなど)を渡すと、Warningが発生します。この警告は非Countable型を渡したことを知らせるもので、nullもこの一つです。nullへのcountは0を返しますが、Warningが出るようになった点が重要です。

PHP 8.0 以降のTypeError挙動

PHP 8.0からは、count関数に無効な型(配列でもCountableでないオブジェクトやスカラー値など)を渡すと、TypeErrorが投げられるようになりました。nullがこれに該当する場合は、警告ではなくTypeErrorになることがあります。これによりコードの安全性や型チェックの厳格さが増しています。

過去のバージョン(PHP 7.1以下)の挙動

PHP 7.1以前では、nullを引数に渡した場合、Warningは発生せず、単に0が返されていました。また、非配列かつ非Countableオブジェクトを渡した場合は1を返すことがありました。こうした仕様は開発者にとって混同の元となっており、バージョンアップ時に注意が必要なポイントです。

nullを渡した際の主な問題点

nullに対して直接countを呼び出すことでどのような問題が生じるかを整理します。予期せぬ挙動やパフォーマンス、可読性など、実際に困るケースを挙げて安全性を高めるためのヒントにします。

警告およびエラーの発生

PHP 7.2以降、nullをcountに渡すとWarningが発生します。PHP 8.0以降ではTypeErrorになる場合もあります。これによりエラー処理が増えるほか、開発中にログに不要なノイズが入る、また意図せぬ例外でアプリケーションが停止する可能性があるなどの問題があります。

期待しない返り値とのズレ

nullを配列として扱っていないコードでcountを使うと、0を返すことがありますが、その変数が空配列であるべきだったものかnullであったかの判別がつかず、しばしばバグの原因になります。また、非Countable型へのcountは1を返したりする過去の仕様も混乱を生みやすいです。

可読性・保守性の低下

nullを許容したcountの呼び出しがコード中に多いと、どの変数が配列であるか、どの変数がnullになるかを把握する必要が増えて、バグ発生リスクが高くなります。また、他の開発者がコードを読んだ時に動作を直感的に理解できないケースが増えます。

安全な書き方とチェック方法

nullに対応する際に推奨される書き方やチェック方法を紹介します。最新のPHP仕様に即した実践的な書き方をマスターすることで、エラーや例外を防ぎ、コードの堅牢性を向上させることができます。

is_countable および is_array を使う

変数が配列であるか、またはCountableインターフェースを実装しているかをチェックする関数が提供されています。これらを使って、countを呼び出す前に安全性を確認する書き方が一般的です。例えば、is_countable($var) が true の場合のみ count を呼び出すことで、無効な型での警告やエラーを避けられます。

Null合体演算子(??)の活用

変数がnullの可能性がある場合、Null合体演算子を使ってデフォルトの空配列を渡す方法があります。たとえば $count = count($items ?? []) と書くことで、$items が null のときにも count {
$count = count($items);
} else {
$count = 0;
}

良い例2:Null合体演算子を使う簡潔な方法

Null合体演算子を使うことで一行で安全な記述ができます。読みやすさも保ちつつ、null対応ができる書き方です。


$count = count($items ?? []);

ケーススタディ:実際のトラブルと対応策

現場で起こる具体的な問題をシナリオベースで考察し、対応策を解説します。Webアプリケーションやフォーム処理、APIとの連携の際などに起きやすいことを取り上げます。

APIからのレスポンスで配列がnullの場合

外部APIから取得したデータが配列を期待していたが、nullで返ってきたケースがあります。このとき、countをそのまま呼ぶと警告や例外に繋がり、画面にエラーが表示されるなどユーザー体験に悪影響があります。対応策として、レスポンス処理時点で null を空配列に変換するなどのラッパー関数を設けることが有効です。

フォーム入力の未設定値

ユーザーからの入力で配列が未設定の場合、nullのまま変数を扱ってしまうことがあります。$_POST や $_GET に対して count を用いる前に isset や empty を使って存在と null でないことを確認することで、意図しない警告を防げます。

条件分岐での誤ったチェック

if (count($items) > 0) と書いていたが、$items が null のときに警告や例外になるケースがあります。empty($items) を使えば null や空配列、数値などもまとめて判定できるため、安全で簡潔な条件になります。

related関数や言語機能との比較

count 関数と似たような役割をもつ PHP の関数や言語機能との違いを比較し、それぞれいつ使うべきかを整理します。挙動の違いを正しく理解することで、使い分けがしやすくなります。

isset と is_null の違い

isset は変数が定義されており、かつ null でないことを判定します。一方で is_null は変数が null であるかどうかのみをチェックします。null値と未定義変数を扱う際には、isset で存在と null の両方を確認し、その後で count を使うのが安全な順序です。

empty の特徴と利点

empty は null、空配列、空文字列、数値 0、false などを「空」と扱う多用途な関数です。count($items) === 0 と empty($items) では empty の方が null や false の扱いでより汎用的です。ただし、empty は真偽値的に評価するため、「要素数が0かどうか」を厳密に分けたい場合には他のチェックも併用が望まれます。

Countable インターフェースとの連携

オブジェクトに Countable インターフェースを実装することで、count を呼び出したときに安全に要素数を返せます。このインターフェースを使えば、独自クラス内で配列やコレクションを持つ際に、一貫した count の動作を定義でき、null や他の型が混入するリスクを下げられます。

まとめ

count 関数に null を渡すときの挙動は、PHP のバージョンによって大きく異なる点がポイントです。古いバージョンでは静かに 0 を返すだけだったものが、PHP 7.2 以降は警告、PHP 8.0 以降では型エラーを引き起こす可能性があります。

安全に使うためには以下のような対策が有効です。
・is_countable または is_array による事前チェック。
・Null 合体演算子を用いてデフォルト値を設定。
・型宣言を使って関数の引数を制御。
・empty を使った簡潔な条件分岐。

これらの方法を組み合わせることで、null による警告やエラーを防ぎ、コードの可読性と保守性を高めることができます。count 関数を正しく理解し、安全に使えるコードを心がけてください。

関連記事

特集記事

コメント

この記事へのトラックバックはありません。

TOP
CLOSE