PHPを7.2にバージョンアップしたら、
count()関数を使用した際エラーメッセージ(Warning) が出るようになった。
#php7.2でcount()を使った際に出たWarning
Warning (2): count(): Parameter must be an array or an object that implements Countable
PHP7.2でcount()関数の仕様が変わり、
count()の引数には、数えられる配列やオブジェクトがないとダメという仕様に変更となった。
ちなみに空の配列でもWarningのエラーが出る。
PHP7.2からのcount()の変更点
まずはcount()のPHPの公式マニュアルを確認する
PHP:count
In PHP 7.2.0
count(NULL) returns a warning:
Warning: count(): Parameter must be an array or an object that implements Countable
In previous versions:
count(NULL) returned 0 without any warnings.
簡単に要約すると、
前のバージョン(7.2)ではカウント不可能なものに対してcount()した場合0を返していたのに対し、
7.2からはWarningを返すよと言っている。
なので例えばどんなタイミングでエラーが起きるかと言うと、
とりあえずcount関数に引数を渡して、カウントしてもらって、何もなければ0を返してもらおうと言う使い方をしていた場合なんかにはエラーが発生してしまう。
count()でWarningの対処法
ではcount()でWarningに対しての対処法を紹介していく。
is_countable()関数を使う
PHP7.3以上であれば、PHP7.3から追加されたis_countable関数を使って、
count()でWarningが発生するのを回避することができる。
$a_count = count($a); // 今まで
$b_count = is_countable($b) ? count($b) : 0; // 新しい方法
上記のように、is_countable関数で事前にカウント可能かの判定を嚙ますと言う手順を入れ、その結果で処理を振り分けるやり方が最もシンプルなcount()でWarningを回避する方法だと思う。
is_array()、isset()関数を使う
下記の参考記事で紹介されていた対処法の引用になるが、
is_array()、isset()なんかを使うとより柔軟にcount()のWarningエラーを防ぐことができるようだ。
参考:https://qiita.com/masaki-ogawa/items/1671d110b2286ececd09
つまり、countを使いたい、でも変数の中身が配列またはオブジェクトの場合もあるし、NULLを返す場合もあるよという時には
if (is_array($hoge)) { count($hoge); }
という判定をさせると回避できそう。
また、単なるNULLチェックをするだけなのにcountで判定している場合は
isset($hoge)
もしくは
!empty($hoge)
に変更してあげれば万事解決できそうということがわかった。
countable ではない型をカウントしたときのパターン
では最後に、
countableではない型をカウントした時のパターンが公式マニュアルに載っていたので、参考までに紹介しておく。
countable ではない型に対して count() (およびそのエイリアスである sizeof()) を使ったときに
E_WARNING
が発生するようになりました。
<?php
var_dump(
count(null), // NULL はカウントできません
count(1), // integer はカウントできません
count(‘abc’), // string はカウントできません
count(new stdclass), // Countable インターフェイスを実装していないオブジェクトはカウントできません
count([1,2]) // array はカウントできます
);上の例の出力は以下となります。
Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d int(0) int(1) int(1) int(1) int(2)
関連記事
コメントを残す