:
回複討論(解決方案)
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,是這樣的。
是兩個類的值,只是如果不是私人,父類的值與子類一樣。
如果父類有私人的屬性,那麼父類的方法只為父類的私人屬性服務。