PHP5から7へのバージョンアップ対応メモ

実際はバージョンアップ以外の固有の問題の方が大変だったりする。







方針


全体的にモダンな環境にする。
ソースの書き換え自体は極力おこなわない。
文字コードは全体的にUTF-8に変更。
ライブラリは基本的に新しいものに変更(更新が途絶えていたら面倒)
各種ミドルもバージョンアップ(DBなど)


PHP5 → 7 移行手順



公式ドキュメントの付録に移行手順が載っている
https://www.php.net/manual/ja/appendices.php

基本的にコンストラクタやmysql関数など軽微な修正のみ。
ライブラリだとあまり見ない関数を使っていたりする。新しいバージョンがあればそちらを使用する。

5.6 → 7.0
https://www.php.net/manual/ja/migration70.php

7.0 → 7.1
https://www.php.net/manual/ja/migration71.php

7.0 → 7.2
https://www.php.net/manual/ja/migration72.php

7.0 → 7.3
https://www.php.net/manual/ja/migration73.php

7.0 → 7.4
https://www.php.net/manual/ja/migration74.php




文字コード変換



文字コードがShift-JISの場合UTF-8に変更しておく。
nkfコマンドが便利。
プロジェクトディレクトリで以下のコマンドで一括変換。
find . -type f -name "*.php" -exec nkf --overwrite {} \;


PHPモジュールチェック



新しい環境に移行するなら必要(いまなら大体クラウドとかになるはず)
php -m > modules.txt


PHP7ccで互換性チェック



https://github.com/sstalle/php7cc
統計をとって種類ごとにまとめて対応確認。

特殊な書き方をしていなければ大体以下のような対応で十分なはず。

[Error] Invalid octal literal
8進数として無効な数値。不具合っぽい?

[Error] Removed function "mysql_xxxx" called
応急処置としてmysqli_xxxxに変更。引数が入れ替わってたりするので注意。

[Error] Syntax error, unexpected xxxx on line xxxx. Processing aborted.
構文エラー。不具合っぽい?

[Error] PHP 4 constructors are now deprecated
非推奨のコンストラクタ。

[Error] Result of new is assigned by reference
PHP 5 以降では、new 演算子が自動的に参照を返すように。
https://www.php.net/manual/ja/language.operators.assignment.php#language.operators.assignment.reference
$o = &new C;

$o = new C;

[Error] Removed function "split" called
・preg_split()
・explode()
・str_split()
を代わりに使用する。
https://www.php.net/manual/ja/function.split.php



参考



https://engineer.blog.lancers.jp/2019/05/finish_php73/

2019年9月26日木曜日