PHPで配列の要素数を取得するためによく使われるcount関数ですが、引数にnullや配列でない値を指定したときに「何が起きるのか?」を正しく理解して使わないと、意図しない警告やエラー、バグの原因になります。最新情報を含め、nullを渡したときの挙動、注意点、安全な書き方、バージョンごとの差異などを丁寧に解説します。
目次
PHP count 関数 null の基本挙動
PHPのcount関数にnullを渡したときの基本的な挙動は、PHPのバージョンによって異なります。過去のバージョンではsilentに処理される場合がありましたが、最近のバージョンでは警告やエラーを伴うようになっています。nullは配列でもCountableオブジェクトでもないため、非Countable扱いとなります。
PHP 7系におけるnull渡しの挙動
PHP 7.2以降、nullをcountに渡すとE_WARNINGが発生するようになりました。同時に結果としては 0 を返します。この変更は、非Countableの値を誤って渡しているコードを検出しやすくするためです。
PHP 8系での挙動の変化
PHP 8.0以降は、count関数のシグネチャが強化され、引数に配列またはCountableなオブジェクト以外を渡すとTypeErrorが投げられます。つまりnullを渡すことはエラー扱いとなります。静的型付けのコードやエラーハンドリング設定により予期しない例外が発生する可能性が高くなっています。
バージョンごとの挙動比較
以下に主なバージョンにおけるnull渡し時の挙動を比較します。
| PHPバージョン | nullを渡したときの結果 | 警告/エラー |
|---|---|---|
| PHP 7.1以前 | 0 を返す、警告なし | なし |
| PHP 7.2〜7.4 | 0 を返す | E_WARNING 発生 |
| PHP 8.0以降 | 例外が発生する(TypeError) | エラー扱い |
なぜnullをcountに渡すと問題になるのか
nullを渡す状況は現実によくあり、例えばAPIの返り値、データベースの結果、外部入力の未定義値などです。nullをそのままcountに渡すコードを書いていると、バージョンアップ時に警告やエラーが発生し、予期せぬ挙動を引き起こします。これを防ぐために、安全な書き方や防衛的プログラミングが必要です。
誤った使い方の実例
以下のようなコードは問題を引き起こすことがあります。
- $items = null;
echo count($items); - $result = someFunctionThatMayReturnNull();
if (count($result) > 0)…
PHP 7.2以降では警告が出るかもしれませんし、PHP 8 では TypeError になる可能性があります。これによりアプリケーションが停止したり、想定外の挙動をすることがあります。
どうして警告や例外が導入されたか
非Countable型(null、スカラー値、オブジェクトでCountable未実装)の値をcount()に渡すことは、しばしばバグの原因となっていました。そのため、PHP 7.2で警告が、PHP 8で例外が導入され、こうした misuse を明示的に検出できるようになっています。これにより、より堅牢なコードが書けるようになっています。
nullを安全に扱う方法とベストプラクティス
nullを引数に渡す可能性がある変数に対しては、事前チェックやフォールバックを用いて安全に count を呼び出すことが重要です。ここでは有効な方法とその使い分けを具体的に紹介します。
is_array または instanceof Countable チェック
まず最も基本的で確実な方法は、変数が配列か Countable インタフェースを実装しているかを調べてから count を実行する方法です。
if (is_array($value) || $value instanceof Countable) {
$cnt = count($value);
} else {
$cnt = 0;
}
これにより、PHP 7.2 以降の警告や、PHP 8 の例外を回避でき、明確な意図で処理できます。
null 合体演算子(null coalescing operator)を利用する
PHP の null 合体演算子を使って、変数が null のときに空の配列を代わりに使う方法です。非常に簡潔で読みやすいコードになります。
$cnt = count($items ?? []);
この方法だと、$items が null の場合は [](空配列)が使われ、count で 0 を返すため安全です。可読性も高く普及してきている書き方です。
関数やメソッドの戻り値を配列に統一する
API 呼び出しやデータベースクエリなど、null を返す可能性がある処理では、戻り値を常に配列にするよう設計することが望ましいです。null や false を返す代わりに空の配列を返すことで、count を使う側は null チェック不要になります。
function getItems(): array {
$data = fetchSomething();
if ($data === null) {
return [];
}
return $data;
}
この方針はコード全体の整合性と保守性を高め、安全性を確保します。
実際のコード例と比較:null vs 配列 vs その他の値
具体的なコード例を通して、各ケースで何が返るか/何が起こるかを比較してみます。最新のPHPバージョンを想定した挙動です。
null を渡した場合
PHP 7.2~7.4 では null を渡すと count(null) は 0 を返して警告が発生します。PHP 8 ではこの操作は TypeError を投げます。
例:
var_dump(count(null)); // PHP7.2+: 警告 + int(0)
// PHP8+: TypeError
空配列を渡した場合
空の配列を渡すと count; // int(0)
他の非配列・非Countable値を渡した場合(文字列・真偽値・数値など)
PHP 7.2~7.4 では、非Countable値を渡すと count(文字列/数値/真偽値) は 1 を返し、警告が出ます。PHP 8 では TypeError となります。
例:
var_dump(count(false)); // PHP7.2+: 警告 + int(1)
var_dump(count(123)); // 警告 + int(1)
// PHP8+: TypeError
is_countable 関数の利用とそのメリット
PHP 7.3 で導入された is_countable 関数は変数が count() に適用可能かをチェックするのに便利なビルトイン関数です。null や非Countableな値を渡す前に安全性を確認できるため、コードが整理され可読性も高まります。
使い方と簡単な例
以下は is_countable を使って安全に count を呼び出す例です:
if (is_countable($value)) {
$cnt = count($value);
} else {
$cnt = 0;
}
このようなチェックを入れることで、PHP のバージョンに関わらず安全な動作ができます。
メリット・デメリット比較
主なメリットは可読性が高く、null や未定義変数に対応できることです。デメリットとしては「式が長くなる」「チェックコードが散在する」ことがあります。大量の場所で count を使うケースでは共通のヘルパー関数にまとめることが有効です。
バージョンアップ時の留意事項と互換性確保
PHP をバージョンアップする際には count 関数に null を渡している箇所が警告や例外の原因になるため事前対応が必要です。特にフレームワークやライブラリが古いコードを多数含む場合には影響が大きいです。
コード中の null を探す
プロジェクト全体で count(null) が起きる可能性のある箇所をチェックする方法には、静的解析ツールの活用や IDE の検索機能が有効です。null や未定義変数を渡している箇所を発見し、前述の安全な書き方に修正することをおすすめします。
テストの整備
ユニットテストや統合テストで、null や異常系のデータを渡したときの挙動を確認するテストケースを増やしましょう。これによりバージョンによる挙動の違いを把握しやすくなり、将来の変更に備えられます。
実用的なユースケースでの適用例
実際の場面でnullを含む可能性のあるデータを扱うとき、どのパターンがどう役立つかをいくつか示します。
APIからのレスポンス処理
たとえば外部APIで items フィールドが返ってこない場合、items が null になることがあります。このとき count(items) を直接使うと警告や例外になるので、items ?? [] とするか、is_array チェックを入れることで安全に処理できます。
データベースフェッチで結果がないとき
fetchAll などは行がない時に空配列を返すことが多く安全ですが、fetch や他の方法で null や false を返すものもあります。そういう関数の戻り値をそのまま count に渡す前に型を統一するのが望ましいです。
テンプレートレンダリングや変数表示
ビューやテンプレートでユーザ入力やデータがない場合がある変数を count() で使うケースです。ここで null をそのまま渡すとテンプレートエンジンやブラウザ表示で予期せぬ警告が表示されることがありますので、デフォルト値として空配列を代入しておくとよいです。
まとめ
PHP の count 関数に null を指定したときの挙動は、バージョンによって大きく異なります。古いバージョンでは静かに 0 を返していたものが、PHP 7.2 以降では警告を発し、PHP 8 以降では TypeError を投げるようになっています。これは非Countable 値を渡すことによるバグを見つけやすくするための仕様変更です。
安全に count を使うには、
・変数が配列または Countable を実装しているかチェックすること
・null 合体演算子を利用してデフォルトで空配列を使うこと
・関数の戻り値を常に配列に統一すること
・is_countable を活用することが重要です。
これらのベストプラクティスを守ることで、count(null) による警告や例外を防ぎ、安定して配列の要素数を安全に取得できるコードが書けるようになります。
コメント