Menu
Coddy logo textTech

Public・Protected・Private

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

Encapsulation の章へようこそ! カプセル化とは、class の内部データへのアクセスを制御することです。PHP には、properties と methods にどこからアクセスできるかを決定する3つのアクセス修飾子があります:publicprotectedprivate

各修飾子の仕組みは次のとおりです:

<?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 を使用してください。

challenge icon

チャレンジ

簡単

access modifiers が機密データを保護する仕組みを示す、安全な従業員管理システムを構築しましょう。コードを実行する場所(クラス内部、child class 内部、または外部)に応じて、異なるレベルの情報に access できる class hierarchy を作成します。

コードを3つのファイルに分けて整理します。

  • Employee.php: 適切な可視性レベルで従業員データを管理する Employee class を Create します。この class には次のものを含めます。
    • 従業員の名前を表す public property $name(誰でも見て安全な情報)
    • 内部 ID を表す protected property $employeeId(child classes に必要)
    • 機密性の高い給与情報を表す private property $salary(この class だけが直接 access できる)
    constructor は3つの値をすべて受け取り、それらを代入する必要があります。private salary を返す public method getSalary() を追加します。これは protected data に access するための制御された方法です。また、"[name] works here" を返す public method getPublicInfo() も追加します。
  • Manager.php: Employee を extends する Manager class を Create します。Employee file を include します。constructor は name、employeeId、salary、department name を受け取る必要があります。最初の3つの値を使って parent constructor を Call し、その後 department を private property に保存します。"Manager [name] (ID: [employeeId]) leads [department]" を返す public method getTeamInfo() を追加します。child class は protected $employeeId に access できますが、private salary に access するには getSalary() が必要になる点に注目してください。
  • main.php: Manager file を include します。4つの input を受け取ります。name、employee ID、salary(string として受け取り integer に変換します)、そして department name です。これらの値で Manager instance を 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: [Your translated content here]

自分で試してみよう

<?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() を呼び出した結果を出力する
?>
quiz icon腕試し

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

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

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