一個關於父類方法訪問子類對象中的公有屬性的問題

來源:互聯網
上載者:User


回複討論(解決方案)

private $_name = '韓'; 是父類私人屬性,所以子類不能修改其值。
showName是父類方法,所以把父類的$_name = '韓'; 輸出。

把private 改為 protected 或 public就可以了。

或者在Kang類重寫一下showName方法。

p1='.$this->p1.',_name='.$this->_name;        echo '
類:'.get_class($this).',方法:'.__METHOD__; }}class Kang extends Han{ public $p1 = 10; public $_name = '康'; public function showName(){ echo '
p1='.$this->p1.',_name='.$this->_name; echo '
類:'.get_class($this).',方法:'.__METHOD__; }}echo '';$o = new Kang;var_dump($o);echo '
p1='.$o->p1.',_name='.$o->_name;$o->showName();?>

private $_name = '韓'; 是父類私人屬性,所以子類不能修改其值。
showName是父類方法,所以把父類的$_name = '韓'; 輸出。

把private 改為 protected 或 public就可以了。



我要的是“解釋”,就是為什麼這裡輸出的是“韓”而不是“康”?不是為了要輸出這個“康”這個屬性資料。
你說的這個“showName是父類方法,所以把父類的$_name = '韓'; 輸出。”,略算解釋,但我還是想要更深入的說法。
我知道showName是父類方法,輸出的"韓“是父類的私人屬性值。
我的意思是,"$o"這個對象,也就是showName中的$this,明明是有公有屬性_name, 和p1,為什麼在其中p1可以輸出10,而_name輸出的是私人的那個,而不是公有的那個?(我們可以觀察到,$o也就是$this中有2個_name,一個公有,一個私人)。
明明在外面,$o->_name是可以輸出”康“的,而showName中的$this也就是這個$o, 則在這裡面,怎麼$o->_name輸出的就是”韓“了呢?

謝謝 fdipzone!

因為私人的是不可侵犯的,所以私人的屬性不能被覆蓋

因為私人的是不可侵犯的,所以私人的屬性不能被覆蓋


我明白該父類的屬性並沒有被覆蓋。倒是引出了另一個問題,那就是,我們var_dump($o),可以看到有2個_name屬性,一個私人,一個公有,則該私人的該如何看待的問題。因為按通常說法,私人屬性是不能繼承的,則子類中定義的_name作為公有屬性,並沒有覆蓋父類的同名屬性。相反,應該看作是子類的”全新屬性“。則在子類對象$o中看到的這個私人$_name,該做如何解釋呢?

不過我的困惑仍然是這樣:$o->_name作為公有的屬性明明是可以直接存取的(輸出”康“),但在其繼承下來的方法showName中,$this->_name為什麼就不是這個公有的_name,而是私人的_name呢?這裡,我代碼中給出的$o和$this毫無疑問肯定是“同一對象”。

明明在外面,$o->_name是可以輸出”康“的,而showName中的$this也就是這個$o, 則在這裡面,怎麼$o->_name輸出的就是”韓“了呢?

showName是父類的方法,所以是調用父類的屬性_name。
而$o->_name是調用子類對象的_name屬性,所以會讀取Kang的_name

而把private $_name改為 public $_name;,則子類執行個體化時,會用子類的_name覆蓋父類的_name,即父類的_name等於子類的_name。

而在Kang中添加showName,這樣會覆蓋父類的showName方法,顯示的就是子類的_name。

var_dump 反映的是 kang 的內部情況,自然私人屬性也是會展示出來

showName 方法是 Han 定義的,他的 $this 自然是 Han,由於私人屬性 _name 沒有被覆蓋所以能被他訪問到
而外部只能訪問到 Kang 定義的公有屬性 _name

如果你在 Kang 中也定義一個 showName 那麼 私人屬性 _name 在 Kang 中就訪問不到了

var_dump 反映的是 kang 的內部情況,自然私人屬性也是會展示出來

showName 方法是 Han 定義的,他的 $this 自然是 Han,由於私人屬性 _name 沒有被覆蓋所以能被他訪問到
而外部只能訪問到 Kang 定義的公有屬性 _name

如果你在 Kang 中也定義一個 showName 那麼 私人屬性 _name 在 Kang 中就訪問不到了



其他的我都能認可,能理解,但關於這一句“showName 方法是 Han 定義的,他的 $this 自然是 Han”,我實際測試其實是,$this和$o是“全等”的,實際上就是一個對象($o)。
另外,從var_dump($o)看到的對象$o的內部情況,確實可以看到它有兩個_name屬性,一個是公有的,一個是私人的。或者,理論上,在showName中,這兩個其實都能訪問到。比如,把Han類中的私人屬性_name注釋掉,就可以訪問其子類的公有的_name屬性了。
實際上,我的問題,就在這裡:為什麼這裡輸出的是私人的那個_name,而不是共有的那個_name。
我想要知道的是一個理論上的解釋,或原理上的解釋,至於現象,或單純的解釋為“因為showName是Han類定義的,所以Han類中的私人屬性可以被其訪問到”,我是知道的。
這裡可以肯定的是,$o對象有兩個_name屬性,一個來自Han類的私人,一個來自Kang類的公有,showName()方法對這兩個都可以訪問到。我想到的一個可能的解釋是:方法優先訪問其所在類中定義的”同屬一類“的屬性。但實際上,這個解釋是我想象出來的,我沒有在哪裡見過。所以,我就想要知道,一個更深入的有關此現象的解釋。
ok?謝謝各位!

你把 echo '
類:'.get_class($this).',方法:'.__METHOD__;
改成 echo '
類:'. __CLASS__ .',方法:'.__METHOD__;
就可以從結果中看出了

p1=10,_name=康
p1=10,_name=韓
類: Han,方法:Han::showName

雖然 Kong 了繼承了 Han 的方法 showName (__METHOD__ 為 Han::showName)
但他依然工作在 Han 類中,那麼 $this->_name 就是 Han::_name 並且永遠都是
如果 Han::_name 不是私人的,那麼 Kong::_name 將會覆蓋 Han::_name
但並不是說 $this->_name 訪問的是 Kong::_name,而實際上依然是 Han::_name,只不過兩個的值相同而已

嗯,9樓xuzuning版主這次的解釋已經接近我想要的了,hoho。

我再就細節探討探討。

你讓我把get_class($this),替換成__CLASS__,然後得到的是”Han”這個類名。但這隻能說明showName方法所在類,因為__CLASS__永遠指的是其所在方法的所屬類。而並不能說明在showName方法中,$this->_name為什麼是"韓",而不是“康”。而且,在這裡,$this它就是“kang”類對象??不過我突然想到,它確實也是“Han”類對象,因為Kang是Han的子類,子類對象自然一定是父類的對象。由此解釋的話,則$this->_name確實是應該輸出Han::_name的值了。
不過你後面的解釋,showName方法“依然工作在 Han 類中,那麼 $this->_name 就是 Han::_name 並且永遠都是”,是否過於絕對呢?比如,如果Han中沒有_name這個屬性,則$this->_name不就訪問了Kang類對象$o(也就是這裡的$this)的_name了麼。但你後面的解釋說,如果Han::_name不是私人的,則會被子類覆蓋,然後此時訪問的$this->_name將仍然是Han::_name,對我來說倒是挺新鮮的,受益匪淺。

如果Han::_name不是私人的,則會被子類覆蓋,然後此時訪問的$this->_name將仍然是Han::_name,是這樣的。
是兩個類的值,只是如果不是私人,父類的值與子類一樣。

如果父類有私人的屬性,那麼父類的方法只為父類的私人屬性服務。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.