phpのバージョンを上げる機会があったのですが、バージョンアップ後にエラーが発生するようになりました。
Parameter must be an array or an object that implements Countable
調べてみると、
php7.2からの変更点で
countableではない型に対してcount()を使用した場合にE_WARNINGが発生するようになりました。
参照 :countable ではない型をカウントしたときの警告
<?php
var_dump(
count(null), // NULL はカウントできません
count(1), // integer はカウントできません
count('abc'), // string はカウントできません
count(new stdclass), // Countable インターフェイスを実装していないオブジェクトはカウントできません
count([1,2]) // array はカウントできます
);
Countableではないとは、Countableインタフェースを継承していないクラスのことです。
今まで、オブジェクトの存在有無チェックとしてcountを使用していたりしているとphpが吸収して動いていただけなのですが、
カウントを意図的に明記したい時以外で変数の有無チェックのような場合は
empty()やisset()を使用すべきのようです。
php7.2まではカウントできる変数の判定としてis_arrayも使用できます。
<?php
// php7.2
if (is_array($hoge)) {
count($hoge);
}
ちなみに7.3からはcountが使用できる変数かどうかの関数としてis_countableが追加されました。
<?php
// php7.3
if (is_countable($bar)) {
count($bar);
}
カウント可能かどうか判定する明示的な関数になるので、場合によっては意図的なコードを記述するのにも使用したいですね。
下位互換のない変更点ではありますが、今までがよしなに動いていただけなのでコード整理するいい機会かもしれないですね。