17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

qnoteAdvent Calendar 2021

Day 3

PHP 8.1 がリリース!だけど思わぬ落とし穴も

Last updated at Posted at 2021-12-02

PHP 8.1 がリリース!

2021年11月25日に PHP 8.1 がリリースされました :tada:

enum の追加や readonly プロパティが設定できるなど、嬉しい機能が盛りだくさんですね。
詳しい内容は既に記事がありますので、ぜひそちらをご覧ください(感謝! :bow: )。

Laravel の対応は?

普段は Laravel をメインで使っていますので、 PHP 8.1 の恩恵を受けるためには Laravel のバージョンアップをしなければなりません。
Github を見ると、2021/10/22 リリースの v8.67.0 からサポートされているようです。

ただ、依存パッケージが対応しているかなどは調査が必要ですし、リリース済のコードだと尚更気軽にバージョンアップはできないです。
つまりプロジェクトによってはあまり関係ない...そんなふうに考えていた時期が僕にもありました。

一方その頃...

それはいつも通りチームメンバーが PHP 8.0 × Laravel v8.33.1 環境で CD/CI を回したときでした。
急に CD/CI が泡を吹いて倒れたのです。

エラーログ
Fatal error: During inheritance of ArrayAccess: Uncaught ErrorException: Return type of Illuminate\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in vendor/laravel/framework/src/Illuminate/Collections/Collection.php:1411

みたことないエラーだったので、パッと見は原因がわかりませんでした。
ちょっと前までは元気に動いていたのに一体どうして...
ただ、幸いにも原因はすぐに目星がつきました。

原因は composer の docker image

このエラーはバックエンドのビルド時に起きたもので、そこでは Dockercomposer:2 というイメージを使用していました。
このイメージの中で使用されている PHP のバージョンが 8.1 に上げられたことが原因でした。

スクリーンショット 2021-12-01 18.00.47.png

イメージを composer:2.1.11 に指定したところ、無事にビルドが通るようになりました。
composer:2.1.12 以降は PHP 8.1 を使うようになっているようなので、しばらくは注意が必要です。

教訓

Docker のイメージはちゃんとマイナーバージョンまで指定した方がいいですね。
あと今回は PHP 8.1 がリリースされたことを知っていたことが大きく、エラーになったタイミングとリリースされた日が近かったので目星がつき、早期の解決につながりました。
自分が使っている技術については最新情報をキャッチアップすることが大事だと改めて認識しました。

17
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?