Public・Protected・Private
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 38/91。
Encapsulation の章へようこそ! カプセル化とは、class の内部データへのアクセスを制御することです。PHP には、properties と methods にどこからアクセスできるかを決定する3つのアクセス修飾子があります:public、protected、private。
各修飾子の仕組みは次のとおりです:
<?php
class BankAccount {
public $accountHolder; // どこからでもアクセス可能
protected $accountNumber; // このクラスと子クラスからアクセス可能
private $balance; // このクラス内でのみアクセス可能
public function __construct($holder, $number, $balance) {
$this->accountHolder = $holder;
$this->accountNumber = $number;
$this->balance = $balance;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder . "\n"; // 動作する - public
echo $account->getBalance(); // 動作する - public メソッド
出力:
John
1000$account->balance に直接 access しようとすると、private であるためエラーが発生します。同様に、class 階層の外部から $account->accountNumber に access する場合も該当します。この保護により、機密データは管理された method を通じてのみ変更できます。
| 修飾子 | 同じ class | 子 class | 外部 |
|---|---|---|---|
public | はい | はい | はい |
protected | はい | はい | いいえ |
private | はい | いいえ | いいえ |
重要なポイント: 直接 accessed されるべきでない内部データには private を、child classes が必要とするデータには protected を、安全な外部 access にのみ public を使用してください。
チャレンジ
簡単access modifiers が機密データを保護する仕組みを示す、安全な従業員管理システムを構築しましょう。コードを実行する場所(クラス内部、child class 内部、または外部)に応じて、異なるレベルの情報に access できる class hierarchy を作成します。
コードを3つのファイルに分けて整理します。
Employee.php: 適切な可視性レベルで従業員データを管理するEmployeeclass を Create します。この class には次のものを含めます。- 従業員の名前を表す
publicproperty$name(誰でも見て安全な情報) - 内部 ID を表す
protectedproperty$employeeId(child classes に必要) - 機密性の高い給与情報を表す
privateproperty$salary(この class だけが直接 access できる)
getSalary()を追加します。これは protected data に access するための制御された方法です。また、"[name] works here"を返す public methodgetPublicInfo()も追加します。- 従業員の名前を表す
Manager.php:Employeeを extends するManagerclass を Create します。Employee file を include します。constructor は name、employeeId、salary、department name を受け取る必要があります。最初の3つの値を使って parent constructor を Call し、その後 department を private property に保存します。"Manager [name] (ID: [employeeId]) leads [department]"を返す public methodgetTeamInfo()を追加します。child class は protected$employeeIdに access できますが、private salary に access するにはgetSalary()が必要になる点に注目してください。main.php: Manager file を include します。4つの input を受け取ります。name、employee ID、salary(string として受け取り integer に変換します)、そして department name です。これらの値でManagerinstance を Create します。次の3行を Print します。- 直接 access した manager の name(public property)
getTeamInfo()を calling した結果getSalary()を calling した結果
この challenge は encapsulation の実例を示しています。name は自由に access でき、employee ID は protected visibility によって child classes と共有され、salary は parent class 内に閉じ込められます。つまり、制御された public method を通じてのみ access できます。
REQUIRED OUTPUT FORMAT:自分で試してみよう
<?php
require_once 'Manager.php';
// 入力を読み取る
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));
// TODO: 入力値で Manager インスタンスを作成する
// TODO: マネージャーの名前を出力する(パブリックプロパティとして直接アクセス)
// TODO: getTeamInfo() を呼び出した結果を出力する
// TODO: getSalary() を呼び出した結果を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ