導入
PHPでの大規模開発において、クラス設計は避けて通れない重要なスキルです。しかし、初心者のうちは「どの変数やメソッドをどこまで公開すべきか」という境界線が曖昧になりがちです。適切にアクセス権を管理することは、予期せぬ外部からの書き換えを防ぎ、安全で保守性の高いコードを書くための第一歩です。今回はPHPのクラスにおける「アクセス修飾子」の役割と、現場での使い分けについて解説します。
基礎知識
クラスは、プロパティ(変数)とメソッド(関数)を一つの単位としてまとめたものです。このクラス内の各要素に対し、どこからアクセスを許可するかを決めるのが「アクセス修飾子」です。
public(公開):どこからでも自由にアクセス可能です。
private(非公開):そのクラスの内部からのみアクセス可能です。外部からは隠蔽されます。
protected(限定公開):そのクラス自身と、それを継承した子クラスからのみアクセス可能です。
また、クラス内で自身のプロパティやメソッドを呼び出す際には「$this」という擬似変数を使用します。これはインスタンス自身を指す特別な変数であり、クラス内では必須の記述となります。
実装/解決策
実務では「カプセル化」の考え方が重要になります。プロパティを直接公開(public)せず、原則としてprivateやprotectedにし、必要な場合のみメソッド経由で操作させることで、クラス内部の状態を保護します。
サンプルプログラム
以下は、ユーザー情報を管理するクラスを想定した実装例です。
name = $name;
}
// privateな変数へのアクセスを許可するメソッド(ゲッター)
public function getName() {
return $this->name;
}
}
class AdminUser extends User {
public function getRole() {
// 親クラスのprotectedプロパティにはアクセス可能
return $this->role;
}
}
$user = new AdminUser(‘山田太郎’);
// echo $user->name; // これはエラーになります(privateのため)
echo $user->getName(); // メソッド経由で取得:山田太郎
echo $user->getRole(); // 子クラスからアクセス:member
?>
応用・注意点
現場でよく陥るミスとして「とりあえず全部publicにする」という設計があります。しかし、外部から自由に変更できる変数が多すぎると、バグが発生した際に「どこで値が書き換わったのか」の特定が困難になります。
注意点:
1. 原則はprivateから: プロパティはデフォルトでprivateにし、外部から必要なものだけをゲッター(取得用メソッド)として公開するのが安全です。
2. 継承関係の考慮: 子クラスで再利用したい変数はprotectedにしますが、公開範囲が広がるため、慎重に設計してください。
3. $thisの忘れ物: クラス内のメソッドでプロパティを参照する際、つい「$name」と書いてしまいがちですが、必ず「$this->name」とする必要があります。
これらを意識するだけで、クラスの堅牢性は飛躍的に向上します。ぜひ、次回の開発からアクセス修飾子を意識した設計を取り入れてみてください。