PHP 2018年05月25日 16:37 編集
ローカルPCにインストールしているXamppをアップデートしてPHPのバージョンがPHP7.2.5になったらあちこちで警告が出るようになりました。
create_functionを使わず、ネイティブの無名関数を使ったほうがいいということです。具体的には
$attr['ID']がsetされてなかったら、''を代入するという処理です。$attrが未定義の場合も問題ないはずでなぜエラーになるかわかりませんでしたが、調べてみると$attrの型がstringになっている場合もあって、その状態で実行するとエラーになっているようです。エラーを回避するためにとりあえず上記の式の前に
'0.84479900 1527156353'
のような文字列を返しています。PHP7.1ではこの文字列のまま計算しても適当にfloatに変換してくれていましたが、7.2では警告が出るようになりました。microtime(True)を指定するとfloatを返しますが、小数点以下の桁数が減るので、文字列のままにした方がより精度の高いマイクロ秒が得られます。文字列は小数部分と整数部分をスペースで区切っているので、小数部分だけを抽出するために
バージョン7.2では、型について厳格になったようです。別の型ということになっているのにその型ではできない処理をしようとしたら、前のバージョンではその処理が行える型に変更したりする部分もあったが7.2以降ではエラーや警告を出すということになっているようです。
create_function()は非推奨
まず、create_function関数が非推奨になったためにその警告が出ます。create_functionを使わず、ネイティブの無名関数を使ったほうがいいということです。具体的には
create_function( '$a,$b', 'return strlen( $b ) - strlen( $a );' )は
function($a,$b) { return strlen( $b ) - strlen( $a ); }に変えます。
each()も非推奨
このほかeach()関数も非推奨になっています。mpdfモジュールでwhile(list($file,$info)=each($this->images)) {という部分で警告が出ているので、
foreach ($this->images as $file=>$info) {と変更すると警告は出なくなりました。
非配列に要素を追加すると警告
mpdfモジュール関係ではcssmgr.pdfでif (!isset($attr['ID'])) { $attr['ID']=''; }のような行でも警告が出るようになりました。
$attr['ID']がsetされてなかったら、''を代入するという処理です。$attrが未定義の場合も問題ないはずでなぜエラーになるかわかりませんでしたが、調べてみると$attrの型がstringになっている場合もあって、その状態で実行するとエラーになっているようです。エラーを回避するためにとりあえず上記の式の前に
if (isset($attr) && !is_array($attr)) { $attr = array(); }を追加するとなんとかエラーが出なくなりました。
文字列の計算をすると警告
$tm1 = microtime();を実行すると警告が出るようになりました。microtime()は、現在の Unix タイムスタンプをマイクロ秒単位で返す関数ですが、デフォルトではfloatではなく、
$tm2 = microtime();
echo $tm1 - $tm2;
'0.84479900 1527156353'
のような文字列を返しています。PHP7.1ではこの文字列のまま計算しても適当にfloatに変換してくれていましたが、7.2では警告が出るようになりました。microtime(True)を指定するとfloatを返しますが、小数点以下の桁数が減るので、文字列のままにした方がより精度の高いマイクロ秒が得られます。文字列は小数部分と整数部分をスペースで区切っているので、小数部分だけを抽出するために
list($tm1) = explode(' ',microtime());のように変更すると警告は出なくなりました。
list($tm2) = explode(' ',microtime());
echo $tm1 - $tm2;
配列の追加
キーが数値の配列に追加する場合はarray_push('abc')とするより
$array[] = 'abc';の方が速いらしいということで、もっぱら下を使っていますが、追加する変数の型が配列になっていないとエラーが出るようになりました。たとえば
$array = '';はエラーになるので、$arrayの型がarray以外になっている可能性がある場合は、
$array[] = 'abc';
unset($array)あるいは
$array = array();と初期化しておく必要があります。これは[]を使って配列を追加する場合だけでなく、配列型になっていない変数を配列として扱おうとすると、同じようなことが起こると思われます。
バージョン7.2では、型について厳格になったようです。別の型ということになっているのにその型ではできない処理をしようとしたら、前のバージョンではその処理が行える型に変更したりする部分もあったが7.2以降ではエラーや警告を出すということになっているようです。
counter:5,318