【PHP】クラスのアクセス権【基本と応用】

【PHP】クラスのアクセス権【基本と応用】

クラスのアクセス権とは?

PHPのクラスには、メンバ変数やメソッドのアクセス範囲を制限する「アクセス権(アクセス修飾子)」があります。 これにより、外部からの直接的なアクセスを制御し、安全で保守性の高いコードを書くことができます。

public(パブリック)

public を指定すると、そのプロパティやメソッドはどこからでもアクセスできます。


class Sample {
    public $name = "Hello";
    
    public function showName() {
        echo $this->name;
    }
}

$obj = new Sample();
echo $obj->name; // "Hello" と表示
$obj->showName(); // "Hello" と表示

private(プライベート)

private を指定すると、そのクラス内でのみアクセス可能となり、外部や継承先のクラスからはアクセスできません。


class Sample {
    private $name = "Hello";
    
    private function showName() {
        echo $this->name;
    }
}

$obj = new Sample();
echo $obj->name; // エラー: private プロパティにアクセス不可
$obj->showName(); // エラー: private メソッドにアクセス不可

protected(プロテクテッド)

protected を指定すると、同じクラスとその子クラスの中でのみアクセスできます。


class ParentClass {
    protected $name = "Hello";
    
    protected function showName() {
        echo $this->name;
    }
}

class ChildClass extends ParentClass {
    public function show() {
        echo $this->name; // OK
        $this->showName(); // OK
    }
}

$obj = new ChildClass();
$obj->show(); // "Hello" と表示

echo $obj->name; // エラー: protected プロパティには外部からアクセス不可

アクセス修飾子の省略

アクセス修飾子を省略した場合、PHP では public とみなされます。


class Sample {
    var $name = "Hello"; // public と同じ扱い
}

$obj = new Sample();
echo $obj->name; // "Hello" と表示

アクセス権の具体的な例

例えば、銀行口座クラスを作る場合、残高は外部から直接変更できないように private にし、 残高を取得するメソッドや入金・出金を行うメソッドを用意します。


class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function withdraw($amount) {
        if ($this->balance >= $amount) {
            $this->balance -= $amount;
        } else {
            echo "残高不足です。";
        }
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(1000);
$account->withdraw(500);
echo $account->getBalance(); // 500 と表示

継承時のアクセス権の挙動

継承時にアクセス修飾子がどのように影響するかを確認しましょう。


class ParentClass {
    public $publicVar = "Public";
    protected $protectedVar = "Protected";
    private $privateVar = "Private";

    public function showVars() {
        echo $this->publicVar;
        echo $this->protectedVar;
        echo $this->privateVar;
    }
}

class ChildClass extends ParentClass {
    public function showVarsFromChild() {
        echo $this->publicVar; // OK
        echo $this->protectedVar; // OK
        echo $this->privateVar; // エラー: private は継承されない
    }
}

アクセス権の適切な使い方

– データのカプセル化を意識し、外部から直接アクセスが不要なものは private にする。
– 継承関係のあるクラスで利用する可能性があるものは protected にする。
– 外部に公開する必要があるものは public にする。
– 直接のアクセスを防ぐために、gettersetter を活用する。

これらを適切に使い分けることで、コードの安全性やメンテナンス性が向上します。

コメントは受け付けていません。