Menu
Coddy logo textTech

PrivateプロパティとProtectedプロパティ

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 18/91。

これまで、どこからでもアクセスできるpublicプロパティを使用してきました。しかし、データを保護するためにアクセスを制限する必要がある場合もあります。PHPには、さらに2つの可視性修飾子、privateprotectedが用意されています。

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を使用します。どちらも外部からの直接アクセスを防ぎ、オブジェクトの内部状態を安全に保ちます。

challenge icon

チャレンジ

簡単

private および protected プロパティを使用して機密データを保護する方法を示す、安全な従業員管理システムを構築しましょう。

適切な Access control を使用して従業員情報を管理する、連携して動作する3つのファイルを作成します。

  • Employee.php: すべての従業員の基盤となる Employee class を Define します。protected $name property(Child class から Access できるようにする)と、private $salary property(salary を directly 変更できるのはこの class のみ)を持たせます。constructor は name と salary を accepts し、両方の property を設定します。name を returns する public getName() method、salary を returns する public getSalary() method、指定された amount 分だけ salary を増やす public giveRaise($amount) method を追加します。
  • Manager.php: Employee を extends する Manager class を Define します。先頭で Employee file を Include します。private $department property を追加します。constructor は name、salary、department を accepts し、parent::__construct($name, $salary) を使用して parent constructor を call してから、department を設定します。protected $name property に directly Access して "[name] manages [department]" を returns する getDetails() method を Create します。また、department を returns する getDepartment() method も追加します。
  • main.php: 両方の class file を Include します。name "Sarah"、salary 75000、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() を使って新しい給与を出力する
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ