JavaScript勉強会

JavaScriptの学習日記

PHP7.2でcount()のエラー対策

WebサーバーのPHPを7.2にバージョンアップしたら、エラーメッセージが出るようになりました。

 

A PHP Error was encountered

Severity: Warning

Message: count(): Parameter must be an array or an object that implements Countable

 

PHP7.2でcount()関数の仕様が変わり、引数には数えられる配列やオブジェクトがないとダメになりました。

空の配列でもWarningのエラーが出ます。(この扱いの変更が困る)

 

qiita.com

 

前のバージョンではcount(NULL)に対して0を返していたが、PHP7.2からwarningを出しているとのこと。

つまり、countを使いたい、でも変数の中身が配列またはオブジェクトの場合もあるし、NULLを返す場合もあるよという時には

if (is_array($hoge)) {

 count($hoge);

}

という判定をさせると回避できそう。

また、単なるNULLチェックをするだけなのにcountで判定している場合は

isset($hoge)

もしくは

!empty($hoge)

に変更してあげれば万事解決できそうということがわかった。

 

対応策

「qdmail」というメール配信用のライブラリーを使っていたら、このエラーに遭遇しました。

PHP高機能日本語メール送信ライブラリ・文字化けフリー - Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

 

とりあえずの対処として、count()をラップしたmyCount()を作り、count()と置き換えました。

 

<?php
if( !function_exists( 'myCount' )) {
    function myCount($array) {
        if (isset($array)) {
            return count($array);
        }
        return 0;
    }
}
?>

 

PHP関数の仕様を確認

isset()

PHP: isset - Manual

isset — 変数がセットされていること、そして NULL でないことを検査する

bool isset ( mixed $var [, mixed $... ] )

返り値

var が存在して NULL 以外の値をとれば TRUE、 そうでなければ FALSE を返します。

 

isset()で変数がNULLではないことが確かめられます。

=何らかの値が入っていることが保証できる。

 

empty()

PHP: empty - Manual

empty — 変数が空であるかどうかを検査する

bool empty ( mixed $var )

返り値

var が存在し、かつその値が空や0でなければ FALSE を返します。 それ以外の場合は TRUE を返します。

 

empty()の注意点は、「0」がセットされている場合でもFALSEを返してしまうことですね。

count()の引数をチェックするために使ってもOKですが、この場足はempty()よりもisset()の方が合ってると思います。

 

count()

PHP: count - Manual

count — 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える

int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )

返り値

array_or_countable に含まれる要素の数を返します。 もしパラメータが配列でもなく Countable インターフェイスを 実装したオブジェクトでもない場合、1 が返されます。 ひとつ例外があり、array_or_countable が NULL の場合、 0 が返されます

 

警告

count() は、セットされていない変数に関して 0 を返しますが、変数が空の配列として初期化されている場合にも 0 を返します。 ある変数がセットされているかどうかを調べるには、 isset() を使用してください。

 

引数がNULLでないことを確かめるには、isset()を使用することが推奨されていました。

 

変更履歴

バージョン 7.2.0

説明 count() will now yield a warning on invalid countable types passed to the array_or_countable parameter.

 

PHP7.2で、count()の引数は、数えられる=空ではない配列やオブジェクトじゃないとWarningを吐き出すように変わりました。

以前は引数がNULLかどうかのチェックも兼ねていたけど、その機能がなくなったので、代わりにisset()でNULLチェックをやればいいですね。

 

まとめ

  • PHP7.2で、count()関数の仕様が変更されて、Warningエラーを吐く場合がある。
  • とりあえずなら、自作のmyCount()関数で置き換えて、エラーに対処できる。
  • =isset()でNULLチェックの処理をはさむ。

 

PHPだけでなく、どんなプログラミング言語でも仕様変更によって、後方互換性のない破壊的な変更が行われます。

言語で用意されている素の機能を使うと、対応が面倒くさい場合もあるので、素の機能を自分でラップした関数を用意して、それを使うようにした方が無難かも?

 

 

スラスラわかるPHP

スラスラわかるPHP