Private と Protected プロパティ
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 18/91。
これまで、どこからでもアクセスできる public プロパティを使用してきました。しかし、データを保護するためにアクセスを制限する必要がある場合があります。PHPは、さらに2つの可視性修飾子を提供しています:private と protected です。
private プロパティは、それを定義したクラス内からのみアクセスできます:
<?php
class BankAccount {
private $balance = 0;
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();
出力:
100クラスの外部から $account->balance に直接アクセスしようとすると、エラーが発生します。これにより、deposit メソッドを経由せずに残高が変更されるのを防ぐことができます。
protected プロパティも同様に動作しますが、親クラスを継承する子クラスからもアクセス可能です:
<?php
class User {
protected $email;
public function __construct($email) {
$this->email = $email;
}
}
class Admin extends User {
public function showEmail() {
return $this->email;
}
}
$admin = new Admin("admin@example.com");
echo $admin->showEmail();
出力:
admin@example.com重要なポイント: 定義しているクラスのみがプロパティにアクセスする必要がある場合は、privateを使用します。子クラスもアクセスする必要がある場合は、protectedを使用します。どちらも外部からの直接アクセスを防ぎ、オブジェクトの内部状態を安全に保ちます。
チャレンジ
簡単private(プライベート)プロパティとprotected(プロテクト)プロパティを使用して機密データを保護する方法を示す、安全な従業員管理システムを構築しましょう。
適切なアクセス制御を行いつつ従業員情報を管理するために、連携して動作する3つのファイルを作成します。
Employee.php— すべての従業員のベースとなるEmployeeクラスを定義します。このクラスには、protected $nameプロパティ(子クラスがアクセスできるようにするため)とprivate $salaryプロパティ(このクラスのみが給与を直接変更できるようにするため)を持たせる必要があります。コンストラクタは名前と給与を受け取り、両方のプロパティを設定します。名前を返すパブリックなgetName()メソッド、給与を返すパブリックなgetSalary()メソッド、および指定された金額だけ給与を増やすパブリックなgiveRaise($amount)メソッドを追加してください。Manager.php—Employeeを継承するManagerクラスを定義します。ファイルの先頭で Employee ファイルをインクルードしてください。private な$departmentプロパティを追加します。コンストラクタは名前、給与、部門を受け取るようにし、parent::__construct($name, $salary)を使用して親のコンストラクタを呼び出した後、部門を設定します。protected な$nameプロパティに直接アクセスして、"[name] manages [department]"を返すgetDetails()メソッドを作成してください。また、部門を返すgetDepartment()メソッドも追加してください。main.php— 両方のクラスファイルをインクルードします。名前"Sarah"、給与75000、部門"Engineering"でManagerを作成します。getDetails()を使用してマネージャーの詳細を出力してください。次に、マネージャーに5000の昇給を与え、getSalary()を使用して新しい給与を出力します。各出力はそれぞれの行に表示されるようにしてください。
Manager クラスが protected な $name プロパティには直接アクセスできる一方で、private な給与にアクセスするには getSalary() メソッドを使用しなければならない点に注目してください。これは、protected と private の可視性の重要な違いを示しています。protected は子クラスからのアクセスを許可しますが、private はデータを完全に隠蔽します。
自分で試してみよう
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: 名前が "Sarah"、給与が 75000、部署が "Engineering" の Manager を作成してください
// TODO: getDetails() を使用してマネージャーの詳細を表示してください
// TODO: マネージャーに 5000 の昇給を行ってください
// TODO: getSalary() を使用して新しい給与を表示してください
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3クラスのプロパティ
インスタンスプロパティと静的プロパティクラス定数静的メソッドとプロパティPrivate と Protected プロパティReadonly プロパティ (PHP 8.1)まとめ:銀行口座マネージャー