Shin x Blog

PHPをメインにWebシステムを開発してます。Webシステム開発チームの技術サポートも行っています。

PHP 7 でコードを書いたファーストインプレッション

正月の書き初めとして、PHP 7 でコードを書いてみました。

f:id:shin1x1:20151006225259p:plain

年始から始まるプロジェクトで PHP 7 に取り組む予定なので、素振りも兼ねています。実際に書いて感じたことを挙げてみます。

書いたコード

今回書いたのは、Markdown からコードブロックを抜き出して、それぞれをファイルに出力するコードです。

https://github.com/shin1x1/MarkdownCodeExtractor

書いた動機は、Markdown の書籍原稿からコード部分を抜き出して、サンプルコードとして公開するためです。

原稿は最終的には PDF になるので、そこでの修正は手で加える必要があるのですが、大まかにコードをファイルに落とすだけでもかなり楽なので、サクッと作りました。

Laravel リファレンス 」の私の担当原稿からコードを抜き出したのですが、200 ものコードファイルを一気に生成できました。

PHP 7 で書いた雑感

コードは冒頭でも触れたように PHP 7 で書きました。実際に書いた感触としては、それほど PHP 5 と大きく変わるわけではなく、追加された文法を意識する程度でした。

もう少し大きなコードを書かないと分からない部分はありますが、この感じなら、PHP 5.4 以降をターゲットに書かれたコードはわりとスムーズに PHP 7 へ移行できそうです。

PHP 7 らしい記法は下記の箇所で使用しています。

戻り値の型宣言

PHP 5 で「タイプヒンティング」と呼んでいたものは、PHP 7 では「型宣言(Type declarations)」と呼ぶようです。 http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

無名関数の即時実行

さよなら、call_user_func

?? 演算子

全世界の PHPer が待ち望んでいた ?? 演算子(Null coalescing)! もう連想配列isset やら empty やらでチェックしないで良いので楽ですね。

PhpStorm の PHP 7 対応

PhpStorm 10.0.2 でコードを書いたのですが、PHP 7 の記法への対応はまだバギーな感じでした。

例えば、上記の無名関数の即時実行の箇所は動作するコードなのに error となっていたり、メソッドの doc comment の補完が正常に動作しなかったりしました。今回のコードでは利用していませんが、無名クラス関連も補完がうまく動いていないです。

issue tracker を見ると多くの issue が寄せられているようなので、順次対応が進むのを待ちましょう。(もちろん、コードが書けないわけではないです。まだ完全対応ではないという程度です。)

Style CI

先日のエントリで紹介したコードフォーマットチェックSaaS である Style CI も、PHP 7 のコードは解析できないようで、パースエラーが発生しました。これも待ちですね。

その他

今回利用したライブラリなど。

PINQ

http://elliotswebsite.com/Pinq/

PHP には、LINQ ライクなライブラリがいくつかある(Ginqもそうですね)のですが、PINQ もその1つです。 コレクションはオブジェクトとしてメソッドで操作したいので、PSR-NN で仕様策定して、デファクトの実装が欲しいですね。(SPLで実装されればいいのに。)

下記では、コレクションを順に走査して処理を実行しています。

CodeceptionによるCLIコマンドのアクセプタンステスト

http://codeception.com

実装したコマンドのアクセプタンステストに Codeception を利用しました。 パース対象のデータ(Markdownファイル)を用意して、実行後に生成されたファイルをチェックしているだけなのですが、テストコードは DSL ではなく、ただの PHP スクリプトなので、サクッと書けて良いです。

https://github.com/shin1x1/MarkdownCodeExtractor/blob/master/codeception/acceptance/ExtractMarkdownCodesCommandCept.php

さいごに

PHP はバージョンごとの差異が大きくてマイナーバージョンが上がっただけで動かなくなる」という戯言をたまに見ますが、PHP 7 についてはメジャーバージョンが上がっても、それなりに後方互換性が担保されています。実際、5.6 向けに書いたプロダクションコードを CI 環境の PHP 7 でテストしていますが、全く問題なく動作しています。

なんといっても、PHP 7 に乗せるだけでパフォーマンスが上がるという飴がぶら下がっているので、近年開発されたコードなら多少の手間をかけても移行する価値はありますね。

PHP 7 の時代が来ることは間違いないので、実際に開発して、運用して、知見を貯めていきたいと思います。