[英]About PHP Magic Methods __get and __set on inheritance
OBS:我在這里直接編碼,因為我的代碼要復雜得多。
如果我編碼:
class SuperFoo {
public function __get($name) {
return $this->$name;
}
public function __set($name, $value) {
$this->$name = $value;
}
}
class Foo extends SuperFoo {
private $bar = '';
}
$foo = new Foo();
$foo->bar = "Why it doesn't work?";
var_dump($foo);
結果是:
object(Foo) {
["bar":"Foo":private]=>
string(0) ''
}
而不是:
object(Foo) {
["bar":"Foo":private]=>
string(20) 'Why it doesn't work?'
}
為什么會這樣? 我不想使用數組來保存屬性,因為我需要將它們聲明為單獨的私有成員。
您的代碼應該導致致命錯誤,因為您正在嘗試訪問私有屬性。
在此之前,您應該收到語法錯誤,因為您沒有正確聲明您的函數。
因此,你“結果”var轉儲永遠不會發生。
你已經編輯了你的問題。 它不起作用的原因是因為bar
是Foo
私有的 ( SuperFoo
無法訪問它)。 改為使其protected
。
如果object具有名為$name
屬性, 則不會調用__get($name)
,但它會嘗試直接使用該屬性。 你的屬性是私有的,因此是錯誤的。
將數據寫入不可訪問的屬性時運行__set()。
__get()用於從不可訪問的屬性中讀取數據。
如果Foo :: bar是私有的 , Foo需要覆蓋__get和__set 。 這是因為SuperFoo無法訪問Foo的私有成員。 以下代碼有效,但很難看:
class SuperFoo {
public function __get($name) {
return $this->$name;
}
public function __set($name, $value) {
$this->$name = $value;
}
}
class Foo extends SuperFoo {
private $bar = '';
public function __get($name) {
return $this->$name;
}
public function __set($name, $value) {
$this->$name = $value;
}
}
正確的解決方案是將Foo :: bar可見性修改為protected 。 現在SuperFoo可以訪問Foo :: bar,因此不需要在Foo中覆蓋__get和__set 。
class SuperFoo {
public function __get($name) {
return $this->$name;
}
public function __set($name, $value) {
$this->$name = $value;
}
}
class Foo extends SuperFoo {
protected $bar = '';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.