Code Fix

初級

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);
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in main.php:6

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);
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in main.php:6

戻り値忘れの関数はnullを返します。count()にnullを渡すとPHP8では致命的エラーになります。

直し方: null を [] にします。

この問題を解いてみる →

パターン3

 1  <?php
 2  function loadTags() {
 3      return null;
                 ^
 4  }
 5  $tags = loadTags();
 6  echo count($tags);
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in main.php:6

空の配列を返すつもりがnullのままです。count(null)はPHP7の警告とは違いPHP8では例外になります。

直し方: null を [] にします。

この問題を解いてみる →

パターン4

 1  <?php
 2  function loadOrders() {
 3      return null;
                 ^
 4  }
 5  $orders = loadOrders();
 6  echo count($orders);
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in main.php:6

loadOrders()がnullを返しているため、count()に配列ではなくnullが渡っています。

直し方: null を [] にします。

この問題を解いてみる →

パターン5

 1  <?php
 2  function fetchComments() {
 3      return null;
                 ^
 4  }
 5  $comments = fetchComments();
 6  echo count($comments);
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given in main.php:6

戻り値忘れの関数はnullを返します。count()にnullを渡すとPHP8では致命的エラーになります。

直し方: null を [] にします。

この問題を解いてみる →

よくある誤解

「PHP7と同じでcount(null)は0を返すだけ」という古い情報は8系には通用しません。PHP7では警告付きで0を返していましたが、8ではTypeErrorとして致命的エラーになりました。

実務での勘所

count()が受け付けるのは配列だけではありません。Countableインターフェースを実装したオブジェクト(count()を呼ばれたときにどう数えるかを自分で定義したクラス)も渡せます。エラーメッセージに「Countable|array」と表示されるのはこのためです。nullはこのどちらでもないため、TypeErrorとして拒否されます。独自のコレクションクラスを作る際にCountableを実装しておくと、count($myCollection)という自然な書き方ができるようになります。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)