PHP8.0互換方針
NaifyはPHP8.0を最低動作に保ちつつ、設計は新しいPHPの明確さと不変性に寄せます。
特に業務管理系では、PHP8.0がまだ現役の環境も多くあります。その現実を踏まえて方針と運用方法をまとめます。
設計は最新、コードは互換
Naifyの考え方は、古いPHPに合わせて設計まで後退させることではありません。コードは8.0で動かしつつ、設計判断は新しいPHPの方向性に寄せます。
| 項目 | 方針 |
|---|---|
| 最低動作 | PHP8.0で動くことを守る |
| 設計基準 | PHP8.1+の不変性と明確さを維持する |
| 互換対応 | 将来採用できる書き方をコード上に明示する |
| アップデート準備 | スキャンで候補を一覧化し、PHPアップデート時に置き換える |
PHPアップデート時に採用したい機能の例
| ターゲット | 採用したい機能 |
|---|---|
| PHP8.1 | readonlyなどの不変性強化 |
| PHP8.3 | typed class constants |
| PHP8.4 | asymmetric visibility, property hooks |
| PHP8.5 | clone 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アップデートは全面的な読み直しではなく、対象を絞った作業にしやすいです。
- 互換性チェックで対象を一覧化する
- ターゲットPHPバージョンごとに採用できる構文を確認する
- lintとHTTPテストで回帰がないか確認する
- 不要になったアトリビュートを整理する
コラム:なぜ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側へ寄せます。