導入
PHPで堅牢なアプリケーションを構築する際、クラスのプロパティ(メンバ変数)を適切に制御することは非常に重要です。特に、外部から値を自由に書き換えられる状態(public)は、予期せぬバグの温床になります。本記事では、PHPのクラス設計において基本となる「アクセス修飾子」の役割と、現場で求められる適切な使い分けについて解説します。
基礎知識
PHPのクラスには、プロパティに対する「アクセス権」を制御する3つのキーワードが存在します。これらを適切に設定することで、クラスの内部状態を保護し、カプセル化を実現します。
1. public: クラス内外のどこからでもアクセス可能。
2. private: 定義したクラス内でのみアクセス可能。
3. protected: 定義したクラスと、それを継承した子クラス内でのみアクセス可能。
また、クラス内のプロパティやメソッドにアクセスする際は「$this」という擬似変数を使用します。これはインスタンス化された「自分自身」を指し示す重要なキーワードです。
実装/解決策
実務では、プロパティを基本的に「private」または「protected」にし、必要に応じて「ゲッター(値を取得するメソッド)」や「セッター(値を設定するメソッド)」を用意するのが一般的です。これにより、バリデーション(値のチェック)を挟んだり、読み取り専用のプロパティを作成したりすることが可能になります。
サンプルプログラム
/
class User {
// 外部から直接変更させないためにprivateで定義
private $name;
// 継承先では利用可能なようにprotectedで定義
protected $role = ‘user’;
public function __construct($name) {
$this->name = $name;
}
// 値を取得するためのゲッター
public function getName() {
return $this->name;
}
// 値を更新するためのセッター(バリデーションを挟むことで安全性を確保)
public function setName($name) {
if (strlen($name) > 0) {
$this->name = $name;
}
}
}
// インスタンス化
$user = new User(‘田中太郎’);
// echo $user->name; // これはエラーになります(privateのため)
echo $user->getName(); // メソッド経由で安全に取得
$user->setName(‘佐藤次郎’); // メソッド経由で安全に更新
echo $user->getName();
?>
応用・注意点
現場でよくある失敗として、すべてのプロパティを無思考に「public」にしてしまうケースがあります。これは外部からの不正な値の代入を防げず、デバッグが困難になるため避けるべきです。
また、「private」と「protected」の使い分けに迷った際は、「将来的にこのクラスを継承する可能性があるか?」を基準にしてください。拡張性を考慮するなら「protected」が適していますが、特に継承を意図しないクラスであれば、まずは「private」にしておき、必要に応じて範囲を広げるのが安全です。
さらに、PHP 8.2以降であれば「readonly」プロパティを使用することで、一度設定したら変更できないプロパティをより簡潔に記述することも可能です。常に最新のPHP仕様を取り入れつつ、適切なアクセス制御で堅実な設計を心がけましょう。