はじめに
現在ユアマイスター株式会社でインターンをしている@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);
}
}
このような、関数の中身は上記のようになっています。
単純に引数に渡されたものが、array
かcountable
かどうかをチェックします。
PHP7.3ありがとう
まとめ
countが使えるかどうかは正直、is_array
でもis_countable
を使っても判別できます。
それでも、なんのためにチェックしているのかというのを明確にするためにis_countable
を使った方が良いと個人的には思います。
そのチェックが配列かどうか知りたいということがメインなのか、countできるのか知りたいなのかを関数を使い分けることで、コードを読んだ際に明確になると思います。
なので、これからはcountできるか判別する際には、積極的にis_countableを使って行きたいと思います。
最後に
現在、エンジニア用Twitterアカウント@gawa2101を開設しました。
今後、自身のアウトプットを積極的にしていこうと考えているのでフォローしていただけると幸いです。