2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP7.2以降のcountについて

Posted at

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?