PHP7.2から、countは、countableではない型に対してE_WARNING が発生するようになりました。
つまり、countのパラメータはarrayとcountable以外はだめです。
なのですがPHP7.2以前に書かれたソースコードは、NULLが入る可能性があったり...未定義が入る可能性があったり..結構自由に書かれていることがあります。
countを使うときは、「個数を数えたい場合」か「0か否かの判別で使っている場合」だと思うので、そのふたつの場合の対象方法について描きます。
個数を数えたい場合
個数を数えたい場合、countを使う前に変数が数えられるか判定します。
PHP7.3以降
PHP7.3以降での開発のときは、is_countable()を使います。
is_countableは、arrayかcountableかを判定してくれます。
if(is_countable($a)){
count($a);
}
PHP7.2以前
PHP7.2以前の場合は、is_array()かisset()か!empty()で判定します。
arrayが入ることが確実の場合はis_array()で問題ないです。
if(is_array($a)){
count($a);
}
ですが、countableオブジェクトが入る場合は配列じゃないのでfalseになってしまいますし、未定義が入る場合はNoticesになってしまうので、isset()か!empty()を使います。
ちなみに、未定義を入れてNoticesにならないのは、isset() と empty()だけです。
0か否かの判別で使っている場合
0か否かの判別で使っている場合は、isset, empty, is_nullを使うことをおすすめします。
| isset() | empty() | is_null() | |
|---|---|---|---|
| 0 | true | true | false |
| "0" | true | true | false |
| 1 | true | false | false |
| NULL | false | true | true |
| 未定義 | false | true | true |
| array() | true | true | false |
| array(1) | true | false | false |
単純に0か否かの場合はisset()でいいですが、
配列の中身を判別する際は!empty() を使います。
おまけ
countを使っている箇所を修正してるときに見つけたものです。
<?php
$str = NULL;
$a = explode(" ",$str);
var_dump(count($a));
結果
int(1)
explodeは、NULLを入れるのを受け入れ文字列の配列を返すので、countできる上に1になってしまうのです..!