【社内LT用資料転載】PHP7移行概要

## はじめに
開発チーム全員のベーススキルの平準化・底上げのために社内でLTの試みが始まりました。
折角用意した発表内容を社内だけに留めておくのは勿体無いのでQiitaにも転載します
ゆくゆくはTechBlogを作りたいなという構想もあります。

LTは2018年12月3日に行い資料はその時点での情報となります。
「概要」から下が社内LTに用いた資料となります。
ただ、社内LTという性質上、企業秘密も含まれているため一部資料の修正を行っています。
資料外でも口頭で補足している部分がありますが、当たり前の内容だったり出典が曖昧だったりしているので今回は割愛します。
「知りたいこと」という項目は、次回のLTのネタの提供（LTのネタに困ってたらこれはどう？みたいな）や社内での議論の提起のために設けています。
なので、Qiitaの読者の方には関係ありませんが一応そのままにしています。

LTを行うたびに随時更新していきたいと思います。
第一弾： [PHP7移行概要](https://qiita.com/go12lim/items/8c2823d212a29f16f716)
第二弾： [そうだゴルフをしよう⛳](https://qiita.com/go12lim/items/be1f358a9d930ba312a0)
第三弾： [純粋関数](https://qiita.com/hayashi-ay/items/f6999f6b111bd86efd97)

## 概要
弊システムでは、サーバーサイドの処理を主にPHPで書いています。
新しい商用環境では現行のPHP5.5.xからPHP7.2.xにPHPのバージョンを上げます。

PHPのバージョンアップ自体はyumなどで行なえます。
ただ、新しいPHPのバージョンでは、古いバージョンで使えていた機能が一部利用できなくなったり非推奨になっているのでソースコード側の修正も必要になります。

今回は、以下について話したいと思います。
 - PHPのバージョンについて
 - PHP7に移行するメリット
 - ソースコード側での対応状況
 - 移行を便利にするツールの紹介
 - 知りたいこと

## PHPのバージョン

### 各環境のバージョン
各環境のバージョンは以下になります。

 - 商用環境：5.5.25
 - 新商用環境：7.2.11

### PHP7までの道のり
![PHP7への道のり.png](https://qiita-image-store.s3.amazonaws.com/0/215694/644575c9-3010-3667-0aac-7ccef974d992.png)

### 小ネタ
 - PHP6はどこへ消えた？
 PHP5.6のつぎはPHP6.0を飛ばしていきなりPHP7.0になっています。
PHP6は開発プロジェクトが頓挫したためリリースされなかったようです[^1] [^2]。

 - PHP7.3は今週リリース？
PHPの7.3は12月6日あたりにリリースされる予定だそうです[^3] [^4]。

[^1]: ソース原文：http://schlueters.de/blog/archives/128-Future-of-PHP-6.html
[^2]: 日本語記事：https://news.mynavi.jp/article/20100317-a053/
[^3]: ソース原文：https://news.mynavi.jp/article/20181126-730170/
[^4]: 日本語記事：https://news.mynavi.jp/article/20100317-a053/

## PHP7に移行するメリット
 - 処理速度が早い
 PHP5に比べて2倍ほど処理が早くなりました[^5]。

 - サポート対象になる
PHP5.5はアクティブサポートとセキュリティサポートの期間が終わっています[^6]。
通常PHPの各バージョンはリリースされてから2年間のアクティブサポートとプラス1年間のセキュリティサポート期間があります。
セキュリティサポート期間をすぎるとセキュリティパッチなどが公開されないバージョンとなります。<br>
ちなみにPHP7.0のサポートは本日（12月3日）終了しました。

 - 新しい機能が利用できる
 全てを見れていないので一例だけ紹介します。
PHP7.0から宇宙船演算子という演算子が追加されました。<br>
宇宙船演算子は、二つの式を比較するために使うものです。 `$a` が `$b` より大きい場合は 1、 `$a` と `$b` が等しい場合は 0、 `$a` が `$b` より小さい場合は -1 をそれぞれ返します[^7] [^8]。

```
例）
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
```

[^5]: http://talks.php.net/tokyo15#/
[^6]: http://php.net/supported-versions.php
[^7]: http://php.net/manual/ja/migration70.new-features.php
[^8]: Qiitaの記事：https://qiita.com/Hiraku/items/62821d7d0e7af1ac211e

## ソースコード側での対応状況
###  判明分（対処済み）
 - Excelが出力できない
<br>
Excel出力に用いているPHPExcelというライブラリにPHP7に対応していない箇所があった[^9]。
PHP7.0からはcontinue(break)をループとswitch文以外で使用すると構文エラーになります。
そもそも不要な処理なので削除することで対応しました。


[^9]: https://teratail.com/questions/53604
 
### 判明分（未対処）
 - 暗号化処理
<br>
mcrypt_encrypt()を用いているがPHP7.1.0で非推奨になり、7.2.0では削除されました。
 - 設定値を取得する処理
<br>
 PDOクラスのgetAttribute()関数とPDOクラスを継承したクラスにあるgetAttribute()関数で引数の数が違うためにWarningが出ている。
ただ、getAttribute()関数自体はPHP5.1.0からあるみたいなので[^10]、PHPのどこかのバージョンでタイミングで引数が違う場合Warningを出す仕様になったと思われます。

[^10]: http://php.net/manual/ja/pdo.getattribute.php

## 移行を便利にするツールの紹介
### php7cc
php7cc[^11] [^12]というツールを用いれば、ソースコードを解析してPHP7に対応しているか判定してくれます。
注意点として、PHP7.0までは判定してくれますがPHP7.1とPHP7.2についてはこの方法が使えません。
あとPHP7.0についても全て網羅している保証はありません。

全ファイルについては試していませんが、PHP4のコンストラクタ宣言[^13]などPHP7で非推奨になったものを使用している箇所がありました。

[^11]: https://github.com/sstalle/php7cc
[^12]: 使い方：https://qiita.com/su_mi/items/b9f06a81bdae40b84c61
[^13]: http://php.net/manual/ja/migration70.deprecated.php

## 知りたいこと
 - PHPの新機能
 - バージョンのアップデート
 ライブラリにしてもそうだが、どれくらいの頻度でアップデートするのが最適なのか。