PHP

PHP Notice: A non well formed numeric value encountered in ~が出た!

mistake

PHPを利用していると稀に遭遇する問題があります。
そうです。
バージョン更新の問題です。
7.1に更新したところ、表題のエラーが発生しましたので、今回はこちらについてご説明しますね。

PHP7.1にしたら演算部分でエラーが出ました

PHPのバージョンを7.1に上げたところ、以下のエラーが発生しました。

PHP Notice: A non well formed numeric value encountered in ~

5の時は問題なかったのに…。

エラーは算術演算部分で起こっているんです!

今回エラーが出ていたのは算術演算の部分でした。
確認したところ、php7.1から算術演算の際の挙動が変更になったようです

数値形式ではない文字列を使って、数値を期待する演算 (+ – * / ** % << >> | & ^ や、これらを用いた代入演算) を行おうとしたときに、 E_WARNING あるいは E_NOTICE レベルのエラーが発生するようになりました。 E_NOTICE が発生するのは、文字列が数値で始まっていながら非数値で終わる場合で、 E_WARNING が発生するのは文字列中に数値が含まれない場合です。
<?php
‘1b’ + ‘something’;
上の例の出力は以下となります。
Notice: A non well formed numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d

PHP マニュアル 付録 PHP 7.0.x から PHP 7.1.x への移行

今回エラーが発生していた部分では、.htaccessの「upload_max_filesize」の値(例:2000Mなど)を参照し、それをバイトに変換して比較を行っていました。

しかし、PHP7.1に更新したことで「文字列が数値で始まっていながら非数値で終わる場合」にエラーが出るようになり、今回「2000M」の部分でNOTICEが出力されるようになったということのようです。

ファイルサイズを比較する処理の中で、演算の前に「M」や「G」などの部分を取り外すようにしたところ、NOTICEのエラーは出力されなくなりました!

バージョンの更新をするときはドキュメントをしっかりと読まなければならないと痛感しました…。

終わりに

今回はPHP7系から変更になった算術演算の処理について取り上げました。
公式のドキュメントは大事!

それでは、本日はここまで。
また次回お会いしましょう!