PrivateプロパティとProtectedプロパティ
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 18/91。
これまで、どこからでもアクセスできるpublicプロパティを使用してきました。しかし、データを保護するためにアクセスを制限する必要がある場合もあります。PHPには、さらに2つの可視性修飾子、privateとprotectedが用意されています。
privateプロパティには、それを定義したclassの内部からのみアクセスできます。
<?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 に Access しようとすると、エラーが発生します。これにより、deposit method を経由せずに balance が変更されるのを防ぎます。
protected property は同様に機能しますが、parent を extends する子クラスからもアクセスできます:
<?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重要なポイント: プロパティに定義元のclassだけがアクセスできるようにする場合は、privateを使用します。子クラスからもアクセスする必要がある場合は、protectedを使用します。どちらも外部からの直接アクセスを防ぎ、オブジェクトの内部状態を安全に保ちます。
チャレンジ
簡単private および protected プロパティを使用して機密データを保護する方法を示す、安全な従業員管理システムを構築しましょう。
適切な Access control を使用して従業員情報を管理する、連携して動作する3つのファイルを作成します。
Employee.php: すべての従業員の基盤となるEmployeeclass を Define します。protected $nameproperty(Child class から Access できるようにする)と、private $salaryproperty(salary を directly 変更できるのはこの class のみ)を持たせます。constructor は name と salary を accepts し、両方の property を設定します。name を returns する publicgetName()method、salary を returns する publicgetSalary()method、指定された amount 分だけ salary を増やす publicgiveRaise($amount)method を追加します。Manager.php:Employeeを extends するManagerclass を Define します。先頭で Employee file を Include します。private$departmentproperty を追加します。constructor は name、salary、department を accepts し、parent::__construct($name, $salary)を使用して parent constructor を call してから、department を設定します。protected$nameproperty に directly Access して"[name] manages [department]"を returns するgetDetails()method を Create します。また、department を returns するgetDepartment()method も追加します。main.php: 両方の class file を Include します。name"Sarah"、salary75000、department"Engineering"を持つManagerを Create します。getDetails()を使用して manager の details を Print します。次に manager に5000の raise を Give し、getSalary()を使用して新しい salary を Print します。各出力はそれぞれ別の行にします。
Manager class が protected $name property に directly Access できる一方で、private salary に Access するには getSalary() method を使用する必要があることに注目してください。これは protected と private の visibility の重要な違いを示しています。protected は Child class による Access を許可しますが、private はデータを完全に hidden に保ちます。
自分で試してみよう
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: 名前 "Sarah"、給与 75000、部署 "Engineering" の Manager を作成する
// TODO: getDetails() を使ってマネージャーの詳細を出力する
// TODO: マネージャーに 5000 の昇給を与える
// TODO: getSalary() を使って新しい給与を出力する
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3クラスプロパティ
インスタンスプロパティとStaticプロパティクラスの定数StaticメソッドとプロパティPrivateプロパティとProtectedプロパティReadonlyプロパティ(PHP 8.1)復習 - 銀行口座マネージャー自分で練習してみよう: PHPオンラインコンパイラ