ホームページ  >  記事  >  バックエンド開発  >  PHPでのメンバーの権限について混乱しています

PHPでのメンバーの権限について混乱しています

WBOY
WBOYオリジナル
2016-06-23 13:57:28905ブラウズ

質問: 次のコードがあります:
20870c0d6a2dd50ade622eddb818449d $val) {
$this->$k = $val; 。 set($name, $val) {
$ this->$name = $val; }
}

class Son extends Far
{
protected $a;

public function __construct() {
$this->arr =array(
& gt; '1',
);

親 :: __ が構築されました
}}



;


print_r ($ obj); a は 1 ではありませんが、null です。
Son オブジェクト
(
[a:protected] => 1
[arr:protected] => 配列
(
) [a] => 1
)

)

質問 2: 上記のコードのサブクラスのプライベート $a を protected $a または public $a に変更すると、出力は次のようになります:
Son Object
(
[a :保護されている] => 1
[arr:保護されている] = >




ディスカッションへの返信 (解決策)

何を言っているのかわかりませんか?
印刷結果は正しくありませんか?

訂正、プライベート時の出力結果は以下の通りです:

Son Object(    [a:Son:private] =>     [arr:protected] => Array        (            [a] => 1        )    [bb] => 1)


Son::a is private, far::init can access it

Son::a is private, far::init can access it しない'彼は __set マジック メソッドを持っていますか?

__setは遠くないですか?

__setは遠くないですか?


サブクラスは継承しないのでしょうか?

$Son->bb = 1;
Son が Far の __set を取得したことが証明できます

はい、メソッドは継承ですが、権限は継承によって変更されません

私の妻はあなたのものです、という意味ではありませんあなたは私の父親です、触れることができます


はい、メソッドは継承されていますが、継承によって権限は変更されていません
私の妻はあなたのものです、それは私が触れることができるという意味ではありません

はい、それでは $ __set の this は指されていません。現在のインスタンス オブジェクトは Son のインスタンスです。 __set の機能は、プライベートまたは存在しないメンバーにアクセスすることです

コードが不完全です 長い間見てみたところ、$bb が見つかりました。



コードが不完全です。長い間見ても、$bb さえ見えません。

申し訳ありませんが、$bb は次のように私によって外部的に追加されました:
$obj = new Son();$obj->bb = 1;print_r($obj);


private はプライベート プロパティであり、それ自体で内部的にのみ呼び出すことができ、インスタンスから呼び出すことはできません。
もちろん、Far に値を割り当てることはできませんが、これは正常です。

private はプライベート属性であり、インスタンスからではなく、内部的にのみ呼び出すことができます。
もちろん、Far に値を割り当てることはできませんが、これは正常です。


呃,我的意思是,__set, __get方法其实就是用来访问其中不存在或私有private的成员的方法。手册中如下说明:
“在给不可访问属性赋值时,__set() 会被调用。”

参见:http://www.php.net/manual/zh/language.oop5.overloading.php

你的 __set 方法是定义在 Far 中的,所以他不能访问 Son 的私有属性
这样写就可以了

class Far {    protected $arr;    protected function init() {        foreach ($this->arr as $k => $val) {            $this->$k = $val;        }    }    public function __construct() {        $this->init();    }    public function __set($name, $val) {        $this->$name = $val;    }}class Son extends Far {    private $a;    public function __construct() {        $this->arr = array(            'a' => '1',        );        parent::__construct();    }    public function __set($name, $val) {        $this->$name = $val;    }}$obj = new Son();print_r($obj);
Son Object
(
    [a:Son:private] => 1
    [arr:protected] => Array
        (
            [a] => 1
        )

)

你的 __set 方法是定义在 Far 中的,所以他不能访问 Son 的私有属性
这样写就可以了

class Far {    protected $arr;    protected function init() {        foreach ($this->arr as $k => $val) {            $this->$k = $val;        }    }    public function __construct() {        $this->init();    }    public function __set($name, $val) {        $this->$name = $val;    }}class Son extends Far {    private $a;    public function __construct() {        $this->arr = array(            'a' => '1',        );        parent::__construct();    }    public function __set($name, $val) {        $this->$name = $val;    }}$obj = new Son();print_r($obj);
Son Object
(
    [a:Son:private] => 1
    [arr:protected] => Array
        (
            [a] => 1
        )

)



是的,我之所以写在父类中,就是不想在每个子类中写一个__set,按您所说的是没有问题的。不过让我不明白的是,即然它能从父类得到这个__set的方法。与写在自己内部的__set方法,在操作成员时,倒底有什么不同的。

私有的是不可侵犯的
仔细品味#7的第二句话

私有的是不可侵犯的
仔细品味#7的第二句话



有一点我不明白的是,如果我在__set打印当前$this,这里我得到的是子类对象。那接着$this->name不就是子类对象的方法操作自己的成员么?为可这里权限却没有了。

要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别

要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别



如果你这样说,我就能理解了。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。