1. 本記事のポイント
- 古いPHPコードを現代的な書き方にリファクタリングするポイントを解説
- 実行可能なコード例で、改善前後の比較と注意点を提示
- 実務における保守・改修の判断基準や設計意図にも触れる
2. 古いPHPコードを読みやすく書き換えるには?
PHPは長い歴史を持つスクリプト言語であり、5.x以前に書かれたコードは、現在の7.x〜8.x系の文法や設計思想と大きく異なります。
特に古いPHPでは、関数乱用・グローバル変数依存・クラスの未使用・命名規則の不統一などが多く見られます。これらは保守性や可読性の低下を招き、バグやセキュリティリスクの温床となります。
実務においては、これらのレガシーコードを「すぐにフレームワークに乗せ替える」のではなく、段階的な読み替え・リファクタリングから始めるケースが多くあります。そのため、本記事では「古いコードを読みやすく、安全に現代的に書き換える」ための基本的な観点を示します。
3. 詳細解説
グローバル変数の使用を避け、明示的な引数・戻り値に書き換える
以下は典型的なレガシーPHPコード例です。
// 改善前:グローバル変数に依存
function calcTotal() {
global $price, $tax;
return $price + ($price * $tax);
}
$price = 1000;
$tax = 0.1;
echo calcTotal(); // 1100
このようなコードは、関数の外側にある変数の状態に依存しており、予期しない副作用が発生しやすくなります。
改善例:引数・戻り値によって依存関係を明示することで、再利用性とテスト容易性が向上します。
// 改善後:引数に明示的に値を渡す
function calcTotal(float $price, float $tax): float {
return $price + ($price * $tax);
}
echo calcTotal(1000, 0.1); // 1100
配列アクセスからクラス・型付きオブジェクトへの書き換え
レガシーPHPでは、連想配列を多用してデータ構造を表現することが多いです。
// 改善前:配列ベースのデータ操作
$user = ["name" => "Taro", "age" => 30];
echo $user["name"];
配列は柔軟ですが、キーのミスや型の不整合が実行時エラーを招きやすくなります。
改善例:クラスを使って型と構造を明示すると、IDEの補完や静的解析も可能になります。
// 改善後:クラスを用いた明示的なデータ表現
class User {
public string $name;
public int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
}
$user = new User("Taro", 30);
echo $user->name;
関数や処理の分岐をswitchからmatch式へ(PHP 8.0〜)
PHP 8.0以降では、複数の条件分岐に対してmatch
式が使用できます。これは冗長なswitch構文の代替として読みやすく、式として値を返せるのが特徴です。
// 改善前:switch構文
switch ($status) {
case "ok":
$msg = "正常です";
break;
case "error":
$msg = "エラーです";
break;
default:
$msg = "不明です";
}
// 改善後:match式(PHP8.0以降)
$msg = match($status) {
"ok" => "正常です",
"error" => "エラーです",
default => "不明です",
};
4. よくあるミス・誤解・落とし穴
- 古いコードを単純にコピペして書き換えると、依存関係の見落としや副作用の温存につながりやすい
- クラスを導入しても、プロパティの型指定やアクセス制御(public/private)を怠ると可読性は上がらない
match
構文はPHP 8.0以上でのみ利用可能。環境差異に注意(CI環境など)- グローバル関数や多段ネストされたロジックは、まず関数分割から始めると改善しやすい
5. まとめ
古いPHPコードの改善には、「読みやすさ」と「依存関係の明示」が重要です。単に書き換えるのではなく、設計意図を保ちつつ、PHPの現代的な機能(型宣言、クラス構造、match式など)を活用することで、保守性と安全性を高めることができます。
特に業務コードでは、一括刷新よりも段階的な改善が現実的であり、スモールステップでの置き換えが効果的です。