PHP繼承小疑點

來源:互聯網
上載者:User
PHP繼承小問題
自己寫了一點測試繼承關係的代碼,如下:




class A
{
public $pub_A;
private $pri_A;
public function pub()
{
$this->pub_A = 'It is public of A!';
echo "

".$this->pub_A."

";
}
protected function pri()
{
$this->pri_A = 'It is private of A!';
echo "

".$this->pri_A."

";
}
}

class B extends A
{
public $pub_B;
private $pri_B;
function __construct()
{
echo "

".$this->pri()."

";
$this->pri_A = 10;
echo "

".$this->pri_A."

";
}
}
$b = new B;

?>


重點我標了出來,在父類A中,$pri_A是private的,應該不能被子類B繼承,可為什麼下面可以對pri_A賦值並且顯示出賦值後的數?
------解決方案--------------------
private:方法或者屬性只能從類的一個成員中訪問到,而且無法從繼承類的成員中訪問到。

經過private便簽標記的方法或者屬性可以在繼承類中重新定義。

每一個類只能看到它自己定義的私人方法。
------解決方案--------------------
子類可以通過父類的公有方法去訪問父類的屬性
------解決方案--------------------

我測試了下代碼,如果在A中給$pri_A="aaa",在B中不賦值的話將不能得到值,在B中賦值之後得到賦值後的值,可見在子類中是可以對父類的私人屬性重新定義的。
------解決方案--------------------
引用
重點我標了出來,在父類A中,$pri_A是private的,應該不能被子類B繼承,可為什麼下面可以對pri_A賦值並且顯示出賦值後的數?


問題不是子類訪問了 父類的 私人成員

而是 子類調用了$this->pri()方法

這個方法是繼承父類的

但是父類的這個方法調用了父類的私人成員
------解決方案--------------------
是的,私人屬性不被繼承!
這一點你可以通過這樣看到
function __construct()
{
echo "

".$this->pri()."

";
echo isset($this->pri_A) ? 'yes' : 'no';//這裡將輸出 no
$this->pri_A = 10;
echo "

".$this->pri_A."

";
}

pri() 方法是父類的,自然可以訪問其私人屬性

當你 $this->pri_A = 10; 後,將在對象 $b 中建立名為 pri_A 的公用屬性(public)
這一點你可以這樣看到
print_r($b);
輸出:
B Object
(
[pub_B] =>
[pri_B:private] =>
[pub_A] =>
[pri_A:private] => It is private of A!
[pri_A] => 10
)
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.