1. 導入
PHPで中・大規模なアプリケーションを開発する際、クラスの設計は避けて通れません。特に「どの変数や関数を外部に公開し、どれを隠蔽するか」という設計思想は、コードの安全性と保守性に直結します。本稿では、PHPのクラスにおけるアクセス修飾子(public, private, protected)の役割と、現場で意識すべき設計のポイントを解説します。
2. 基礎知識
クラスとは、関連するプロパティ(変数)とメソッド(関数)を一つにまとめた設計図です。このクラス内の各要素には「アクセス権」を設定でき、これを「アクセス修飾子」と呼びます。
・public:クラスの内外どこからでもアクセス可能。外部インターフェースとして公開するものに使用します。
・private:クラス内からのみアクセス可能。外部に見せる必要のない内部処理や状態管理に使用します。
・protected:クラス内と、そのクラスを継承した子クラスからのみアクセス可能。テンプレートメソッドパターンなどで、子クラスにカスタマイズを許容する場合に使用します。
3. 実装/解決策
現場では「カプセル化」という考え方が重要です。プロパティは基本的にprivateにし、必要な場合のみゲッター(Getter)やセッター(Setter)メソッドを経由してアクセスさせることで、予期せぬ値の書き換えを防ぎ、バグを未然に防ぐことができます。
4. サンプルプログラム
以下は、ユーザー情報を管理するクラスを想定した実装例です。
name = $name;
}
// 外部から安全に名前を取得するためのpublicメソッド
public function getName(): string {
return $this->name;
}
// privateメソッド:クラス内部の複雑な処理を隠蔽する
private function logAccess(): void {
echo “[ログ] ユーザー情報が参照されました。
“;
}
// 外部公開用メソッド
public function display(): void {
$this->logAccess(); // クラス内からはprivateメソッドを呼び出せる
echo “ユーザー名: ” . $this->getName() . “
“;
}
}
$user = new User(“田中太郎”);
$user->display();
// $user->name = “変更”; // これはエラーになります(privateのため)
// $user->logAccess(); // これもエラーになります(privateのため)
?>
5. 応用・注意点
実務で陥りやすいのが「とりあえず全部publicにしておく」という実装です。これは後々の仕様変更で、どの箇所がその変数に依存しているか分からなくなる「スパゲッティコード」の原因となります。
・原則はprivate:まずはprivateで定義し、外部から必要になったらpublicのメソッドを追加する、という「最小限の公開」を意識してください。
・$thisの理解:クラス内でプロパティやメソッドにアクセスする際は、必ず「$this->」を付け忘れないようにしましょう。これを忘れると、クラス内の変数ではなく、ただの未定義のローカル変数として扱われてしまいます。
適切なアクセス制限を設けることは、チーム開発における「意図しない変更」を防ぐための強力な武器になります。ぜひ設計段階から意識してみてください。