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
)