somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】アクセス権

今更ですが、知らなかったのでメモ。

いきなり結論

他のオブジェクトからのアクセス権

同じ型のオブジェクト間では、たとえ同一のインスタンスでなくても お互いの private メンバーや protected メンバーにアクセスすることができます。 これは、そのオブジェクトの内部ではオブジェクトの実装の詳細が既知であるからです。 PHP: アクセス権 - Manual

他のオブジェクトからの場合、見れないと思っていました・・・。見れるということは、変更もできるようです。

以下、privateおよび、protected変数を参照するソースです。やりすぎかと思いましたが、親⇒子、自分自身、子⇒親、親⇒他人のパターンを示しています。必要も無かったかもですがタイプヒンティングで分類してみました。

<?php
/**
 * 親クラス
 */
class parentClass {

    protected  $protected_var;
    private    $private_var;
    public     $name;

    /**
     * コンストラクタ
     */
    public function __construct($name, $protected_var, $private_var) {
        $this->name          = $name;
        $this->protected_var = $protected_var;
        $this->private_var   = $private_var;
    }

    /**
     * parentClassオブジェクトの変数を表示する
     */
    public function echorParentClassVar(parentClass $p_class) {
        echo sprintf(
          '[%s] %s protected_var:%s private_var:%s'.PHP_EOL,
          $this->name, $p_class->name, $p_class->protected_var, $p_class->protected_var
        );
    }

    /**
     * childClassオブジェクトの変数を表示する
     */
    public function echoChildClassVar(childClass $c_class) {
        echo sprintf(
          '[%s] %s protected_var:%s private_var:%s'.PHP_EOL,
          $this->name, $c_class->name, $c_class->protected_var, $c_class->protected_var
        );
    }

    /**
     * otherClassオブジェクトの変数を表示する
     */
    public function echoOtherClassVar(otherClass $o_class) {
        echo sprintf(
          '[%s] %s protected_var:%s private_var:%s'.PHP_EOL,
          $this->name, $o_class->name, $o_class->protected_var, $o_class->protected_var
        );
    }
}
/**
 * 子クラス
 */
class childClass extends parentClass {
}
/**
 * 他人クラス
 */
class otherClass {
    protected  $protected_var;
    private    $private_var;
    public     $name;

    /**
     * コンストラクタ
     */
    public function __construct($name, $protected_var, $private_var) {
        $this->name          = $name;
        $this->protected_var = $protected_var;
        $this->private_var   = $private_var;
    }
}

// 各オブジェクト生成
$a = new parentClass('a', 'a_pro', 'a_pri');
$b = new parentClass('b', 'b_pro', 'b_pri');
$c = new childClass( 'c', 'c_pro', 'c_pri');
$d = new childClass( 'd', 'd_pro', 'd_pri');
$e = new otherClass( 'e', 'e_pro', 'e_pri');

// 親(自分)が親(自分)を呼び出す
$a->echorParentClassVar($a);

// 親(自分)が親(他人)を呼び出す
$a->echorParentClassVar($b);

// 親(自分)が子(他人)を呼び出す
$a->echoChildClassVar($c);

// 子(自分)が親(他人)を呼び出す
$c->echorParentClassVar($a);

// 子(自分)が子(自分)を呼び出す
$c->echoChildClassVar($c);

// 子(自分)が子(他人)を呼び出す
$c->echoChildClassVar($d);

// 赤の他人を呼び出す
//$a->echoOtherClassVar($e);
//PHP Fatal error:  Cannot access protected property otherClass::$protected_var in C:\xampp\htdocs\cakephp\access.php on line 46
//PHP Stack trace:
//PHP   1. {main}() C:\xampp\htdocs\cakephp\access.php:0
//PHP   2. parentClass->echoOtherClassVar() C:\xampp\htdocs\cakephp\access.php:99