25
16

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.

PHP 7.3で追加されたis_countableでcountにハマらなくなった話

Posted at

はじめに

現在ユアマイスター株式会社でインターンをしている@masaki-ogawaです。
以前、PHP7.2のcountにハマった話というQiitaを書かせていただきました。
2018年12月6日に正式にPHP7.3がリリースされました。その中で、新たにis_countable関数が追加され、以前の自分で書いた記事よりもスマートに判定できるようになったので、記事を書こうと思いました。

今回の記事を書くにあたって

PHP7.2のcountにハマった話は自分へのメモのつもりで書いていましたが、今年の8月ごろから徐々にアクセスが増え色々な方にみていただけるようになりました。
今年で、PHP7.0以前のバージョンのサポートが切れるということで、多くの方がPHP7.2以降のバージョンでのcountのwarningで戸惑ったと思います。(自分もその一人です・・・)
※ちなみにphp 7.2 countと検索するとトップでヒットします。ありがとうございます。

今回PHP7.3で良さそうな関数が追加されたので記事を書きたいと思います。

そもそもなぜ、count関数に関する記事を書いたのか?

PHP7.2のcountにハマった話でも書いたように、ユアマイスター株式会社では、今年の春にサイトスピード向上のためにPHP5.6からPHP7.2にバージョンアップを行いました。詳しい経緯は以下の記事にまとまっています。

PHP5.6 + CakePHP3 + Apache2.2のECサービスからAMP並のTTFBを実現するまで

その際に、大量のwarningが出るようになり、そのwarningを調べるにあたり、PHP7.2からにcount関数の扱いがそれ以前バージョンと異なっていることが判明しました。
その際をまとめる上で、上記のPHP7.2のcountにハマった話を書きました。

Warning (2): count(): Parameter must be an array or an object that implements Countable in file名 line 〇〇

※発生したwarning

原因はなんだったのか?

countの引数には配列、もしくはカウントすることができるオブジェクトでなければならない
という理由で、warningが発生しました。
しかし、今まで、PHP7.2以前ではそんなwarningは発生しませんでした。
以前は

count(NULL); // NULL
count(1); // int
count('I love PHP'); // string

これらに対しても0を返していました。

よくよく考えると、NULLって数えられるものではないので違和感があります。

PHP:countを確認すると、PHP7.2からは以下の変更が加えられています。

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.

countの引数には配列、もしくはカウントすることができるオブジェクトでなければならないとなりました。
この条件に当てはまらない場合は、warningが発生しました。

以前の解決法


if (is_array($hoge)) {
    count($hoge);
}

でやっていました。
これはcountの引数には配列という部分をチェックするために、その変数が配列かどうかいうチェックをしていました
配列だった場合、countで要素を数えていました。

PHP7.3から追加されたis_countableを使ってみる

使い方は簡単で、変数の中身が数えられる値かどうかをチェックするというものです。

if (is_countable($hoge)) {
    count($hoge);
}

これで変数の中身が数えられるものであれば、trueを返し、中の処理に入って行きます。

公式のis_countableの中では

引数が、数えられる値かどうかを調べるとあり

if (!function_exists('is_countable')) {
    function is_countable($var) {
        return (is_array($var) || $var instanceof Countable);
    }
}

このような、関数の中身は上記のようになっています。
単純に引数に渡されたものが、arraycountableかどうかをチェックします。

PHP7.3ありがとう

まとめ

countが使えるかどうかは正直、is_arrayでもis_countableを使っても判別できます。
それでも、なんのためにチェックしているのかというのを明確にするためにis_countableを使った方が良いと個人的には思います。
そのチェックが配列かどうか知りたいということがメインなのか、countできるのか知りたいなのかを関数を使い分けることで、コードを読んだ際に明確になると思います。
なので、これからはcountできるか判別する際には、積極的にis_countableを使って行きたいと思います。

最後に

現在、エンジニア用Twitterアカウント@gawa2101を開設しました。
今後、自身のアウトプットを積極的にしていこうと考えているのでフォローしていただけると幸いです。

25
16
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
25
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?