count()にnullを渡したときのTypeErrorの原因
count()にnullを渡すと、PHP8ではTypeErrorが投げられます。関数が値を返し忘れてnullになった変数をそのままcount()に渡すと、ここで止まります。
エラーメッセージの読み方
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in main.php:6
main.php- ファイル名
6- 行番号 — 実際にクラッシュした行
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
count(): Argument #1 ($value) must be of type Countable|array, null given- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 function getItems() { 3 return null; ^ 4 } 5 $items = getItems(); 6 echo count($items);
getItems()がnullを返しているため、count()に配列ではなくnullが渡っています。PHP8ではcount(null)はTypeErrorになります。
直し方: null を [] にします。
パターン2
1 <?php 2 function findUsers() { 3 return null; ^ 4 } 5 $users = findUsers(); 6 echo count($users);
戻り値忘れの関数はnullを返します。count()にnullを渡すとPHP8では致命的エラーになります。
直し方: null を [] にします。
パターン3
1 <?php 2 function loadTags() { 3 return null; ^ 4 } 5 $tags = loadTags(); 6 echo count($tags);
空の配列を返すつもりがnullのままです。count(null)はPHP7の警告とは違いPHP8では例外になります。
直し方: null を [] にします。
パターン4
1 <?php 2 function loadOrders() { 3 return null; ^ 4 } 5 $orders = loadOrders(); 6 echo count($orders);
loadOrders()がnullを返しているため、count()に配列ではなくnullが渡っています。
直し方: null を [] にします。
パターン5
1 <?php 2 function fetchComments() { 3 return null; ^ 4 } 5 $comments = fetchComments(); 6 echo count($comments);
戻り値忘れの関数はnullを返します。count()にnullを渡すとPHP8では致命的エラーになります。
直し方: null を [] にします。
よくある誤解
「PHP7と同じでcount(null)は0を返すだけ」という古い情報は8系には通用しません。PHP7では警告付きで0を返していましたが、8ではTypeErrorとして致命的エラーになりました。
実務での勘所
count()が受け付けるのは配列だけではありません。Countableインターフェースを実装したオブジェクト(count()を呼ばれたときにどう数えるかを自分で定義したクラス)も渡せます。エラーメッセージに「Countable|array」と表示されるのはこのためです。nullはこのどちらでもないため、TypeErrorとして拒否されます。独自のコレクションクラスを作る際にCountableを実装しておくと、count($myCollection)という自然な書き方ができるようになります。