PHP アドバンス

PHP OOP - アクセス修飾子

1. PHPのアクセス修飾子

プロパティやメソッドには、それらがどこからアクセスできるかを制御するアクセス修飾子(Access Modifiers)、または**可視性キーワード(Visibility Keywords)**を設定できます。

PHPには、以下の3つのアクセス修飾子が存在します。

  • public - プロパティまたはメソッドにどこからでもアクセスできます。これがデフォルトの設定です。
  • protected - プロパティまたはメソッドに、そのクラス内、およびそのクラスを継承した派生クラス(子クラス)からアクセスできます。
  • private - プロパティまたはメソッドには、それらが定義されたクラス内からのみアクセスできます。

       注意: アクセス修飾子が指定されていない場合、自動的に public に設定されます。

2. Public アクセス修飾子

public アクセス修飾子を使用すると、クラスのプロパティやメソッドにどこからでもアクセスできるようになります。

以下の例では、$name プロパティと get_details() メソッドはクラスの外部からアクセス可能です。

<?php
class Fruit {
  public $name;

  public function get_details() {
    echo "名前: " . $this->name . ".";
  }
}

$apple = new Fruit();
$apple->name = "Apple"; // 直接アクセス可能
$apple->get_details();
?>

3. Private アクセス修飾子

private アクセス修飾子を使用すると、クラスのプロパティやメソッドには、それらが定義された同じクラス内からのみアクセスを許可します。

以下の例では、$name プロパティは private であり、外部から直接アクセスすることはできません。

<?php
class Fruit {
  private $name;

  public function get_details() {
    echo "名前: " . $this->name . ".";
  }
}

$apple = new Fruit();
$apple->name = "Apple"; // エラー: プライベートプロパティにはアクセスできません
$apple->get_details();
?>

4. Protected アクセス修飾子

protected アクセス修飾子を使用すると、クラスのプロパティやメソッドには、そのクラス内、およびそのクラスを継承したクラス(子クラス)からアクセスできるようになります。

以下の例では、$name プロパティは protected であり、外部から直接アクセスしようとするとエラーになります。

<?php
class Fruit {
  protected $name;

  public function get_details() {
    echo "名前: " . $this->name . ".";
  }
}

$apple = new Fruit();
$apple->name = "Apple"; // エラー: プロテクテッドプロパティにはアクセスできません
$apple->get_details();
?>

4.1 継承クラスにおける Protected の挙動

以下の例では、$name プロパティは protected であるため、クラスの外部から直接アクセスすることはできませんが、サブクラスである Apple クラス(子クラス)内からはアクセス可能です。

<?php
class Fruit {
  protected $name;

  public function setType($name) {
    $this->name = $name;
  }
}

// Fruitクラスを継承した子クラス
class Apple extends Fruit {
  public function getType() {
    // 親クラスのprotectedプロパティにアクセス可能
    echo "名前: " . $this->name . ".";
  }
}

$apple = new Apple();
$apple->setType("Apple");
// echo $apple->name; // エラー: プロテクテッドプロパティには外部からアクセスできません
echo $apple->getType(); // 出力: 名前: Apple.
?>