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になってしまうのです..!