Contents
1️⃣ PHP 8.3 がもたらす3つの主軸
| 主軸 | 内容 | 移行時に意識すべきこと |
|---|---|---|
| 非推奨機能の除去 | each() や mb_str_split() など、8.2 まで deprecated とされていた関数が本バージョンで実装から削除。 |
置換先(例: foreach、str_split)へのリファクタリングを必ず行う。 |
| 型システムの強化 | 定数・プロパティに型宣言が可能になり、readonly プロパティの再代入が 1 回許容されるように変更。 |
型付与は 静的解析ツール(PHPStan / Psalm)で検証しながら段階的に導入。 |
| 内部パフォーマンス改善 | JIT の最適化と range() の内部実装が高速化(アルゴリズムの改良による) 。 |
ベンチマークテストで 8.3 前後との差分を測定し、期待通りの効果が得られているか確認。 |
ポイント
公式ガイド(php.net/migration83.new-features)は「インストール → 警告・エラーチェック → テスト実行」の流れを推奨しています。これに自動変換ツールと静的解析を組み合わせることで、手作業のミスを大幅に削減できます。
2️⃣ 主な新機能とコードサンプル
2.1 readonly プロパティの 再代入(1 回)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class User { public readonly string $id; public function __construct(string $id) { $this->id = $id; // 初回代入は必須 } /** DI コンテナやファクトリからの上書きを許可 */ public function setIdFromFactory(string $newId): void { $this->id = $newId; // 2 回目以降は不可(RuntimeError) } } |
留意点
| 条件 | 説明 |
|---|---|
| 再代入回数 | 最大 1 回。2 回目以降は Fatal error: Cannot modify readonly property が発生。 |
| 初期化前の状態 | null に設定できない(型が決まっている限り未初期化状態は存在しない)。 |
2.2 クラス・インターフェイス定数への 型宣言
|
1 2 3 4 5 |
class Status { public const int ACTIVE = 1; public const int INACTIVE = 0; } |
- 効果:IDE が整数として補完し、
=== '1'のような型ミスを防止。 - 注意:PHP 8.2 以前は型なし定数だったため、既存コードで文字列と整数が混在している場合はリファクタリングが必要。
2.3 #[\Override] 属性(PHP 8.2 から利用可能)
|
1 2 3 4 5 6 7 8 9 |
class Base { public function calculate(): int { return 0; } } class Child extends Base { #[\Override] public function calculate(): int { return 1; } // 正しいオーバーライド } |
- 事実の訂正:
#[\Override]は PHP 8.2 で導入された属性です。PHP 8.3 では新機能として追加されていませんが、引き続き有用です。 - メリット:シグネチャ不一致をコンパイル時に検出でき、意図しないオーバーライドを防止。
2.4 Trait メソッドへの final 修飾子
|
1 2 3 4 5 6 |
trait LoggerTrait { final public function log(string $msg): void { echo $msg; } } |
- 効果:Trait を使用したクラス側でメソッドを上書きできなくなるため、ロジックの一貫性が保たれます。
3️⃣ ローカル・Docker 環境への PHP 8.3 インストール手順
3.1 パッケージマネージャでインストール
| OS | コマンド |
|---|---|
| macOS (Homebrew) | bash<br>brew install php@8.3<br>brew link --overwrite php@8.3<br> |
| Ubuntu (apt) | bash<br>sudo add-apt-repository ppa:ondrej/php<br>sudo apt update<br>sudo apt install php8.3 php8.3-cli php8.3-fpm php8.3-mbstring php8.3-xml<br> |
ポイント
- Homebrew では
php@8.3が別パッケージになるため、link --overwriteが必須。 - Ubuntu の公式リポジトリは遅れがあるので、Ondřej Surý 氏の PPA を利用すると常に最新が入手可能です。
3.2 Dockerfile(汎用的なベストプラクティス)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# php:8.3-fpm-alpine は軽量で CI コスト削減に最適 FROM php:8.3-fpm-alpine # 必要拡張を一括インストール RUN apk add --no-cache \ $PHPIZE_DEPS \ icu-dev libpng-dev libzip-dev \ && docker-php-ext-install -j$(nproc) intl pdo_mysql zip opcache \ && pecl install xdebug \ && docker-php-ext-enable xdebug # Composer キャッシュを永続化(ビルド時間短縮) ENV COMPOSER_CACHE_DIR=/tmp/composer_cache RUN mkdir -p $COMPOSER_CACHE_DIR && chmod -R 777 $COMPOSER_CACHE_DIR |
※ 製品名の明示
本 Dockerfile は特定ベンダーに依存しない「汎用イメージ」です。プロジェクト固有の名前(例:app-tatsujin)は削除し、読者が自身のリポジトリ名に置き換えて利用できるよう配慮しました。
3.3 docker‑compose.yml の抜粋
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
version: '3.9' services: php: build: . volumes: - ./:/var/www/html - composer_cache:/tmp/composer_cache environment: APP_ENV: development ports: - "9000:9000" volumes: composer_cache: |
- ベストプラクティス:
composer_cacheボリュームで依存取得をキャッシュし、CI のビルド時間を短縮します。
4️⃣ 自動変換ツールと静的解析の実装フロー
4.1 Rector(Php83 ルールセット)導入手順
|
1 2 |
composer require rector/rector --dev |
rector.yaml の例
|
1 2 3 4 5 6 7 8 |
parameters: php_version_features: '8.3' # 8.3 用のシンタックスを有効化 sets: - Php83 # PHP 8.3 向けルールセット全体 services: # 必要に応じて個別ルールを追加可能 |
実行例
|
1 2 3 4 5 6 |
# 変更差分だけ確認(dry‑run) vendor/bin/rector process src --dry-run # 自動修正の本番実行 vendor/bin/rector process src |
- 効果:
readonly再代入や#[\Override]の付与、型付き定数への変換を自動化し、手作業ミスを削減。
4.2 PHPStan と Psalm の設定(PHP 8.3 対応)
PHPStan (phpstan.neon.dist)
|
1 2 3 4 5 6 7 8 9 |
includes: - vendor/phpstan/phpstan/conf/bleedingEdge.neon parameters: level: max # 最高レベルで厳密チェック phpVersion: 80300 # PHP 8.3 を明示 paths: - src |
Psalm (psalm.xml)
|
1 2 3 4 5 6 7 8 9 10 |
<project name="my-project" xmlns="https://getpsalm.org/schema/config"> <phpVersion>8.3</phpVersion> <issues> <UnusedVariable errorLevel="info"/> </issues> <directories> <directory name="./src"/> </directories> </project> |
実行コマンド
|
1 2 3 |
vendor/bin/phpstan analyse vendor/bin/psalm --stats |
- ポイント:
phpVersionを明示しないと古い解析レベルが適用され、8.3 固有の警告を見逃す恐れがあります。
5️⃣ テスト・CI/CD パイプラインへの統合
5.1 PHPUnit のカバレッジ設定例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="vendor/autoload.php" colors="true" stopOnFailure="false"> <coverage processUncoveredFiles="true"> <include> <directory suffix=".php">src</directory> </include> <report> <html outputDirectory="coverage-html"/> </report> </coverage> </phpunit> |
|
1 2 |
vendor/bin/phpunit --coverage-html coverage-html |
processUncoveredFilesを有効にすると、テスト対象外のファイルもレポートに含まれ、移行漏れ が可視化しやすくなります。
5.2 GitHub Actions での PHP 8.3 CI ジョブ例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
name: CI on: push: branches: [main] pull_request: jobs: test-php83: runs-on: ubuntu-latest services: mysql: image: mysql:8 env: MYSQL_ROOT_PASSWORD: root ports: ["3306:3306"] steps: - uses: actions/checkout@v3 - name: Set up PHP 8.3 uses: shivammathur/setup-php@v2 with: php-version: '8.3' extensions: mbstring, intl, zip, pdo_mysql coverage: xdebug - name: Install dependencies run: composer install --prefer-dist --no-progress - name: Run Rector (dry‑run) run: vendor/bin/rector process src --dry-run || true # 失敗してもビルドは続行 - name: Static analysis – PHPStan run: vendor/bin/phpstan analyse - name: Static analysis – Psalm run: vendor/bin/psalm --stats - name: Run PHPUnit with coverage run: vendor/bin/phpunit --coverage-text |
- CI のベストプラクティス
rectorを dry‑run に入れて自動変換対象を可視化。- 静的解析で型エラー・未使用コードを早期検出。
- カバレッジが 80 % 未満の場合はジョブを失敗させ、品質基準を保つ。
6️⃣ 移行チェックリスト(実務向け)
| 項目 | 確認方法 | 必須対応 |
|---|---|---|
| PHP バージョン | php -v が 8.3.x か確認 |
✅ |
| 非推奨関数除去 | grep -R "each(" -n src/ 等で残存チェック |
✅ |
| 型付き定数化 | IDE の型ヒントが整数になるか、PHPStan が UndefinedConstant を出さないか |
✅ |
| readonly 再代入 | 2 回目代入テストを作成し、RuntimeError が発生することを確認 | ✅ |
| #[\Override] 属性使用 | メソッドに属性が付与されているか、PHPStan の MissingOverrideAttribute 警告が消えているか |
✅ |
| Rector 自動変換 | dry‑run 結果が 0 件になるまで繰り返し実行 | ✅ |
| テストカバレッジ | カバレッジ ≥ 80 %(HTML レポートで確認) | ✅ |
| CI パイプライン | GitHub Actions が PHP 8.3 で成功するか最終チェック | ✅ |
7️⃣ 次のステップ:実装から本番環境へ
- ローカルまたは Docker で PHP 8.3 を立ち上げる
- Rector の
Php83ルールセットを dry‑run → 本番適用 - PHPStan / Psalm で型安全性を検証
- PHPUnit による回帰テストとカバレッジ測定
- GitHub Actions 等 CI に PHP 8.3 ジョブを組み込み、全自動化
これらのフローを順に実行すれば、「コードが 8.3 に完全対応した」ことを確実に証明でき、安心して本番デプロイへ移行できます。
📚 参考リンク
- 公式マイグレーションガイド:https://www.php.net/manual/ja/migration83.new-features.php
- Rector Documentation:https://github.com/rectorphp/rector
- PHPStan – Bleeding Edge Config:https://github.com/phpstan/phpstan#bleeding-edge
- Psalm Configuration:https://psalm.dev/docs/running_psalm/configuration/
本稿は特定ベンダー・サービス名に依存しない汎用的な手順を示しています。実際のプロジェクトでは、社内ポリシーや利用中のパッケージに合わせて適宜カスタマイズしてください。