PHPバージョンアップ・脆弱性対応 > 対応事例
自社サイトを PHP 7.4 から PHP 8.5 へ移行しました
2026年11月
- PHP 7.4.33 で動いていた自社サイトを、PHP 8.5 へ移行
- 表示上のエラーは出ないのに、お問い合わせフォームだけが空白になる問題が見つかった
- 原因は PHP 8.0 で廃止された「古い形式のコンストラクタ」。検証環境でフォームを最後まで動かして発見
背景
弊社のコーポレートサイトと製品サイトは、長年運用してきたPHPで動いています。中には十数年前に書かれたプログラムや、文字コードが Shift-JIS のものも含まれており、PHP 7.4 のまま運用していました。
PHP 7.4 は2022年11月にサポートが終了しています。お客様にPHPのバージョンアップをご提案している立場として、まず自社サイトを最新の PHP 8.5 へ移行することにしました。
進め方
- 検証環境を用意する:Docker で PHP 8.5 の環境を作り、本番と同じ設定(短縮タグの有効化など)を再現しました。警告・非推奨の通知もすべて表示する設定にしています。
- 削除された関数を機械的に探す:PHP 7.0〜8.5 で削除・変更された関数や書き方を、ソース全体から検索しました。
- 全ページを表示して確認する:PHPを含むすべてのページを開き、警告・非推奨の通知が出ないことを確認しました。
- フォームを最後まで動かす:入力 → 確認 → 送信 → メール到着まで、実際に操作しました。メールは検証環境では送らず、送信内容をファイルに書き出して確認しています。
見つかった問題と対処
1. お問い合わせフォームが空白になる(古い形式のコンストラクタ)
製品サイトのお問い合わせフォームを開くと、本来の入力欄が表示されず、ほぼ空白のページになりました。PHPのエラーは一切出ていません。
原因は、フォームの画面を組み立てるクラスの「コンストラクタ」の書き方でした。PHP 4 の時代は、クラスと同じ名前のメソッドを書くと、それがコンストラクタ(生成時に自動で呼ばれる初期化処理)になりました。
class Simpty {
function Simpty() { // PHP 4 形式のコンストラクタ
// テンプレートの読み込みなどの初期化
}
}
この書き方は PHP 7 では非推奨の通知が出るだけで動いていましたが、PHP 8.0 からは単なる普通のメソッドとして扱われ、自動では呼ばれなくなりました。初期化が行われないため、テンプレートが読み込まれず、画面が空になっていたのです。
class Simpty {
function __construct() { // 現在の書き方
// テンプレートの読み込みなどの初期化
}
}
エラーが出ないため、ページを開いて表示を確認するだけでは見落としやすい問題です。「フォームを実際に動かす」確認が欠かせない理由がここにあります。
2. 削除された split() 関数
同じクラスの中で、文字列を区切る split() 関数が使われていました。この関数は PHP 7.0 で削除されています。区切り文字が正規表現である必要がない箇所だったため、explode() に置き換えました。
3. 未定義の変数への警告
共通ヘッダーのテンプレートで、ページによっては定義されない変数を参照していました。PHP 8.0 からは、未定義の変数を読むと「注意(Notice)」ではなく「警告(Warning)」が出ます。変数が無い場合の初期値を設定して解消しました。
あわせて、本番環境でエラー内容が画面に表示される設定になっていた箇所を見直し、エラーは画面に出さずログに記録する設定に変更しました。エラー表示はサーバの構成を外部に知らせる手がかりになるため、本番では表示しないのが原則です。
4. Shift-JIS のソースを壊さない
製品サイトのソースは Shift-JIS で書かれています。一般的なエディタで開いて保存すると UTF-8 に変換され、日本語が文字化けすることがあります。修正は変更箇所のバイト列だけを置き換える方法で行い、文字コードを変えずに済ませました。
結果
修正は3ファイル・数行で済みました。PHP 8.5 の検証環境で、すべてのページで警告・非推奨の通知が出ないこと、お問い合わせフォームのメール送信まで正常に動くことを確認したうえで、本番に反映しています。
修正量は少なくても、どこが壊れるかを見つけるまでが本番です。古いサイトほど、エラーを出さずに壊れる箇所が潜んでいます。