簡體   English   中英

關於PHP Magic方法__get和__set繼承

[英]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轉儲永遠不會發生。

編輯:

你已經編輯了你的問題。 它不起作用的原因是因為barFoo私有的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 = '';
}

查看有關可見性的PHP文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM