ホームページ >バックエンド開発 >PHPチュートリアル >PHPでのメンバーの権限について混乱しています
質問: 次のコードがあります:
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 しない'彼は __set マジック メソッドを持っていますか?
__setは遠くないですか?
$Son->bb = 1;
Son が Far の __set を取得したことが証明できます
はい、メソッドは継承ですが、権限は継承によって変更されません
私の妻はあなたのものです、という意味ではありませんあなたは私の父親です、触れることができます
はい、それでは $ __set の this は指されていません。現在のインスタンス オブジェクトは Son のインスタンスです。 __set の機能は、プライベートまたは存在しないメンバーにアクセスすることです
コードが不完全です 長い間見てみたところ、$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
你的 __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
私有的是不可侵犯的
仔细品味#7的第二句话
私有的是不可侵犯的
仔细品味#7的第二句话
要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别
要说多少遍你才能转过弯来呢?
私有的属性,只能被他所在类定义的方法访问
请注意类和对象的区别