PHP5.6からPHP7.1にしたら出たエラー

1.microtime「文字なの?数値なの?ハッキリしてよ!」

■エラー内容
ErrorException: A non well formed numeric value encountered in /ファイル名

意訳:型間違ってますよ
該当行コード:$time = microtime() * 1000;


■エラー原因
http://php.net/manual/ja/function.microtime.php
TRUE を指定すると、microtime() は文字列ではなく float を返すようになります。

■修正方法
数値として扱うときはmicrotime(true)にしろってことですね。
1
2
3
4
5
// PHP5.6
$time = microtime() * 1000;
 
// PHP7.1
$time = microtime(true) * 1000;

2.split「じゃあな。後のことはpreg_splitとexplodeに頼んだ」

■エラー内容
Uncaught Error: Call to undefined function split() in /ファイル名

意訳:split()なんて存在しませんぞ
該当行コード:print_r(split('/・/', $title));


■エラー原因
http://php.net/manual/ja/function.split.php
この関数は PHP 5.3.0 で 非推奨 となり、 PHP 7.0.0 で 削除 されました。

もと(PHP5.3)から非推奨ではあったけど、ついに削除されたようです。


■修正方法
正規表現を使って文字列分割したい場合→preg_split()
正規表現を使わず文字列分割したい場合→explode()
1
2
3
4
5
6
7
8
9
10
$title = "ア・イ・シ・テ・ルのサイン";
 
// PHP5.6
var_dump(split('/・/', $title));
 
// PHP7.1(正規表現を使用)
var_dump(preg_split('/・/', $title));
 
// PHP7.1(正規表現を不使用)
var_dump(explode('・', $title));

3.PHP7.1「これからは連想配列のアクセス順のこと、ちゃんと考えるね…」

■エラー内容
ErrorException: Array to string conversion in /ファイル名

意訳:そこの配列、文字列にしてよ
該当行コード:$this->$user['name']


■エラー原因
http://php.net/manual/ja/migration70.incompatible.php
変数やプロパティそしてメソッドへの間接的なアクセスを、厳密に左から右の順で評価するようになりました。

5.6とPHP7.1では違う順番でアクセスするよう変更になったからArray to string conversionがでちゃうんですね。

私「$this->$user['name'] ってどういう意味かわかる?」

PHP5.6「$this->{$user['name']} って意味だよね!」 →OKや!
PHP7.1「冷静に考えたら ($this->$user)['name'] だったわ」 →errorや!


■修正方法
今までのバージョンにおける右から左の評価を想定しているコードは、 波括弧を使って評価順を明示するように (表の中央列のように) 書き直す必要があります。

ということでエラー回避方法は{}をつけて今までと同じ優先順位を維持させること
1
2
3
4
5
// PHP5.6
$this->$user['name']
 
// PHP7.1
$this->{$user['name']}