PHP8.0互換方針

NaifyはPHP8.0を最低動作に保ちつつ、設計は新しいPHPの明確さと不変性に寄せます。
特に業務管理系では、PHP8.0がまだ現役の環境も多くあります。その現実を踏まえて方針と運用方法をまとめます。

設計は最新、コードは互換

Naifyの考え方は、古いPHPに合わせて設計まで後退させることではありません。コードは8.0で動かしつつ、設計判断は新しいPHPの方向性に寄せます。

項目方針
最低動作PHP8.0で動くことを守る
設計基準PHP8.1+の不変性と明確さを維持する
互換対応将来採用できる書き方をコード上に明示する
アップデート準備スキャンで候補を一覧化し、PHPアップデート時に置き換える

PHPアップデート時に採用したい機能の例

ターゲット採用したい機能
PHP8.1readonlyなどの不変性強化
PHP8.3typed class constants
PHP8.4asymmetric visibility, property hooks
PHP8.5clone with

アトリビュート戦略

#[NaifyCompatibility]は、将来採用できる書き方をコード上に残すための印です。

互換対応で残しておきたい情報は、PHPDocだけに寄せず#[NaifyCompatibility]アトリビュートでも明示します。そうすると、機械的に集められて、IDEでも追いやすいです。

#[\NaifyCompatibility(php: '8.0', upgrade: ['8.1' => 'readonly'])]
final class Table
{
    // ...
}

#[\NaifyCompatibility(upgrade: ['8.4' => 'property hooks'])]
public function getPrimaryKey(): array
{
    return $this->primaryKey;
}
  • 検出できる: Reflectionで機械的に収集できる
  • 構造化できる:バージョンと候補をキー付きで持てる
  • IDEで追いやすい:検索、参照、ハイライトが効く
  • 消し忘れに気づきやすい:バージョンを上げたときの戻し漏れを減らせる

PHPDocは今を読みやすくするために使います。アップグレード情報は、アトリビュートでコード上に残して集められるようにします。

品質と検証

互換方針は、方針だけではなくチェックの仕組みとセットで運用します。NaifyではHTTPテスト、lint、IDEインスペクションを並行して使います。

チェック役割
互換性チェックアトリビュート付きの互換候補を一覧化する
検査結果の自動集計検査結果を集計し、変更前後の差分を確認する
PHP8.0 lint実際に8.0構文として成立しているか確認する
静的解析型や未使用コードなど、構造上の問題をIDEレベルで確認する
守りたいこと
8.0で本当に動くこと
将来置き換えたい互換対応が見えること
互換対応の理由が追えること
PHPアップデートが調査作業にならないこと
避けたいこと
コメントだけで管理すること
互換対応が散らばること
PHPアップデート時に置き換え漏れること

アップグレード手順

最低動作バージョンを引き上げるときは、互換対応をまとめて洗い出して、新しい構文や機能へ順に置き換えていきます。どこに互換対応があるか見えていれば、PHPアップデートは全面的な読み直しではなく、対象を絞った作業にしやすいです。

  1. 互換性チェックで対象を一覧化する
  2. ターゲットPHPバージョンごとに採用できる構文を確認する
  3. lintとHTTPテストで回帰がないか確認する
  4. 不要になったアトリビュートを整理する
テストの方針は テスト体制、品質運用全体は 品質管理、依存を増やしすぎない考え方は 保守性と依存方針 でつながっています。

コラム:なぜPHP8.0を残すのか

PHP8.0は新しい世代ではありませんが、実運用ではまだ使われている環境があります。共有サーバーや既存案件では、すぐに8.2以降へ上げられない場面も珍しくありません。

Naifyは、小さく始めやすく、置けば動くことを強みにしています。その入口を狭めすぎないために、最低動作はPHP8.0に置いています。

具体例:RHEL9系ではまだ遠い話ではない

たとえば、Red Hat公式の「RHEL 9 Application Streams Life Cycle」では、PHP8.0のretirement dateは2032年5月とされています。Rocky Linux 9のサポート終了は2032年5月31日、AlmaLinux 9も2032年5月31日までセキュリティサポートがあります。

つまり、RHEL9系を前提にした現場では、PHP8.0が「もう存在しない前提」で切り捨てられるとは限りません。Naifyは、その現実を無視せずに入口を広く残しています。

互換対応のために設計を古いままにするわけではありません。
入口は広く保ちつつ、設計の基準は新しいPHP側へ寄せます。