2020/09/15 PHPerによるPHPerのための「『PHP8』のニュースや記事を語り合う」TechCafe

2020/09/15、[ラクス](https://www.rakus.co.jp/)による[PHPerによるPHPerのための「『PHP8』のニュースや記事を語り合う」TechCafe ](https://rakus.connpass.com/event/187049/)というイベントがありました。

実はひめやかに参加していたので、以下はそのざっくりメモです。

# TechCafe

## TechCafeとは

エンジニアと技術が交差する憩いの場。
なんかしらの話題でわいわい。

なんでPHP？
ラクスのサービスのうち6個がPHPなので。

対象：PHPを入門後の初級エンジニア～シニアエンジニア

## 本日のテーマ

![vlcsnap-2020-09-15-20h58m37s190.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/a480c82e-7337-6b84-602e-69e53e9cfeac.png)

## 出演者

ラクス　ふじさわ氏
ラクス　加納氏
ラクス　久山氏
ラクス　おおつか氏
白柳隆司氏 https://www.youtube.com/channel/UCv1AIkCCrRB_Tcz_1ZgSoFg/videos
Futoshi Endo氏 https://twitter.com/Fendo181


# PHP8の新機能

## Union Types

TypeScriptとかでもふつうにある機能。
わりと賛否わかれる。
これまでIDEやら静的解析はPHPDocを使っていたが、PHP構文となることで実行時チェックできるようになる。
コメントの更新忘れで古くなるとかが防げる。
nullとかのエッジケースを明示化できる。

PHPは元々自由型だったので複数の型が入ってくることはよくある。
新規コードよりは、レガシーコードのリファクタに利点があるのではないか。

PHPStanを使ってチェックしているが、これが来たらスマートにできそう。
新しく来た人が見たときに助かるのでよい。

Javaの人はきっと許さない。
強い型言語から来たので、型がないと肩が凝る。


## JIT

PHPは、通常はリクエストが来る度にソースコードをOPCodeに変換し、さらにネイティブコードに変換して実行する。

高速化の仕組みとしてOPCacheがある。
OPCodeをキャッシュして、次のリクエストでOPCodeを使い回す。

JITはこの発展系。
ネイティブコードをキャッシュして、次のリクエストでネイティブコードを使い回す。

Webアプリのオーバーヘッドが大半がI/Oなので、Webアプリでは大幅な高速化はなさそう。
高速な計算処理など、これまでC一択、最近はRustだったりした
これをPHPでやるという選択肢の可能性ができる。
Cとちがってメモリ管理とかが簡単なので安全に実装できる。

PHPは遅いってイメージが未だに残ってるので我々がどうにかしていかないと。

`php.ini`オプション`opcache.jit`の説明が微妙に間違ってた。

JIT使うと使う容量が増えてみたいな話があったけど、実はJITを有効化するオプション`opcache.jit_buffer_size`が直接容量を指定する設定なのだ。

PHP8のjitをweb以外でつかうとなると現時点でなにか用途がありますか？
画像処理・ゲーム・機械学習とかどうよ？
セキュリティ関連。


## The nullsafe operator

APIの返り値などツリー形式データにアクセスする際、`if($session !== null)`のネストをなくすことができる。

10行くらいが1行にリファクタできるなんて気持ちいい。
全ての言語に広まってほしい。
JavaScriptでも同じRFCが上がってる。


## Named arguments

メソッドの引数に名前を付けて渡すことができる。
呼び出し側を見るだけで、目的が一目瞭然。
通常引数は順番が大事だったけど、名前付き引数は順番を入れ替えることもできる。
最後の引数だけ指定したい場合は途中の引数のデフォルト値を調べて渡さないといけなかったけど、それをスキップできる。

これまではデフォルト引数の問題を解決するため配列`$options`を渡すみたいなことをやっていたこともあったが、何を設定できるのかわからなかった。

Union Typesもだが、プロジェクトに入って間もない人にとって助かる機能。

IDEなんかでがんばって実現してるものを取り入れるみたいな傾向が見える。

PHPに求められるものが変わった。
できる人が手の中でちょっとしたものを作るみたいなツールから、大人数で大規模な使用に耐えるシステムに。


## Attributes

PHPDocなどに記述していたメタデータを言語仕様として書けるようになった。

たとえばPHPUnitでは`@after`のようなアノテーションを書けるが、これは単なるコメントで制約もなく、ライブラリ作者が勝手に決めていた。
取り出しも正規表現とかでがんばって抜き出していた。
言語仕様になるので、リフレクションでアクセスできるようになる。

仕様が二転三転したので、記事によっては古い書き方が残ってたりすることもあるので注意。

PHPUnitは2022年に対応するかも。

アトリビュート自体はライブラリ作者のためのものなので、一般ユーザが気にすることはあんまりない。

## Match expression

switch文によく似たmatch式の導入。

break不要、式なので代入できる、複数条件記述できる、厳密な比較。

`default`がないとエラーになると言っていたけど、実際は`default`がないだけではエラーにならず、どの分岐にも進めなかったときにエラーになる。

単一行でシンプルな代入処理はmatch式、それ以外はswitchがよさそう。


## ==はもはや死語になっていくんだな

ちょっと動けばいいや的なのなら==でいいんじゃね。
その後大きくなるようなら最初から===がいい。


## New mixed type

RFCでは次の用途で用いるとしている。

・型のことを気にしてはいるが、まだ正確に記述していない
・正確に指定することができない
・明確な意図で型を縛っていない

弊社では、リファクタリング途中であるマーキングで使えるんじゃないか？
何も考えてないのか、考えた結果そうしているの違い。

PHPStan通すためにとりあえずmixed書いちゃう的な。

## 時間が来てしまったので残りはスルー

Breaking Changesがいくつもあるので気をつけよう。
正式リリース後にマイグレーションガイドが出るはずなので、それを参考にしよう。

MSがPHP8をサポートしなくなるのでWSL2とか使おう。

PHPの最新話題についていくには[PHPWeeklyのメルマガ](http://phpweekly.com/)がいいぞ。


## エンディング

今後の勉強会の紹介。
9/25 [PHP LT JAM 【LT未経験者歓迎】 #phpltjam](https://rakus.connpass.com/event/187066/)
10/7 [PHPerによるPHPerのための「PHPのニュースや記事を語り合う」TechCafe](https://rakus.connpass.com/event/189017/)

[テックブログ](https://tech-blog.rakus.co.jp/)のご案内。

次回やってほしいことがあったらTwitterで『#PHPTechCafe』で呟いて。


# 感想

私はこの手のイベントに滅多に参加しないのですが、今回はたまたま別件について調べてたところ目に入って、日程も近かったので試しに参加してみました。
で感想ですが、

たいへんもうしわけないのだが、9割方知ってた。

まあ話題からしてPHP8のことで、大概は自分で調べてたから仕方ないですけどね。

しかし私くらいPHP8を追ってる人なんてそれほど多くないと思うので、普通の人が聴くぶんには十分に面白いイベントだったと思います。
便利になる新機能がたくさん紹介されたので、PHPの今後への期待も膨らんだことでしょう。
また単なる新機能の話だけではなく、どうしてその機能が入ることになったのか、PHPは何から何になろうとしているのか、そういった思想的なところの話も面白かったですね。

総合的には、次回もまた参加してみようかなと考えるくらいにはよかったと思います。