【PHP】クラスのアクセス権【基本と応用】
- クラスのアクセス権とは?
- public(パブリック)
- private(プライベート)
- protected(プロテクテッド)
- アクセス修飾子の省略
- アクセス権の具体的な例
- 継承時のアクセス権の挙動
- アクセス権の適切な使い方
クラスのアクセス権とは?
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
にする。
– 直接のアクセスを防ぐために、getter
や setter
を活用する。
これらを適切に使い分けることで、コードの安全性やメンテナンス性が向上します。