ごみばこ

プログラムに関する備忘録などを書いています。

クラス内で自クラスインスタンス生成した時のスコープ

掲題のとおり。

概要

クラスAの中で自身のインスタンスを生成し、 get_object_vars()を実行するとprivateまで返却される。

get_object_varsに関してはマニュアルで以下のように記載されている。 「そのスコープ内」という記述がオブジェクトを指していると解釈していたが、メソッドを呼び出している箇所を指しているみたい?

指定したオブジェクトのプロパティを取得する。
指定した object について、 そのスコープ内でアクセス可能な非 static プロパティを取得します。

class A
{
    private $privateValue = 0;
    public $publicValue1 = 1;
    public $publicValue2 = 2;
    public $publicValue3 = 3;

    public function getProperties(): void
    {
        $instance = new A();
        var_dump(get_object_vars($instance));
    }

    public function set(): void
    {
        $instance = new A();
        $instance->privateValue = 10;
        var_dump(get_object_vars($instance));
    }
}

$a = new A();
$a->getProperties();
$a->set();
実行結果

scope.php:13:
array(4) {
  'privateValue' =>
  int(0)
  'publicValue1' =>
  int(1)
  'publicValue2' =>
  int(2)
  'publicValue3' =>
  int(3)
}

scope.php:20:
array(4) {
  'privateValue' =>
  int(10)
  'publicValue1' =>
  int(1)
  'publicValue2' =>
  int(2)
  'publicValue3' =>
  int(3)
}

結果の通り、private変数まで返却されていることがわかる。

今回わかったこと

  • 同クラスのインスタンスであればprivateにもアクセス出来る
    • javaで似たようなコードを書いても同様な結果が返却された。

勉強不足ですね・・・。