首頁  >  文章  >  後端開發  >  php類別中private屬性繼承問題分析

php類別中private屬性繼承問題分析

高洛峰
高洛峰原創
2016-12-01 11:46:171028瀏覽

請仔細看這句話 如果父類別有私有的屬性。那麼父類別的方法只為父類別的私有屬性服務。 
下面透過一系列列子來加深理解. 
這個例子看起來很奇怪,在子類別中重新定義了一個屬性$sal,系統卻傳回了父類別的屬性。
複製碼 程式碼如下: 
 
class employee{ 
private $sal=3000; 
//protected $sal=3000; public function getSal(){ class; Manager extends employee { 
protected $sal=5000; 

public function getParentSal(){ 
//這裡回傳的是父類的private屬性. 
return parent::Salget(); Manager(); 
echo "PHP ".phpversion()."
"; 
echo $manager->getSal(); 
echo "
"; 
echo "parent's $sal ".$manager-> getParentSal(); 
?> 

程式運算結果是這樣的。注意 第5行的屬性定義變成了protected。
複製程式碼 程式碼如下: 
 
class employee{ 
//private $sal=3000; 
protected $sal=3000; public function getSal(){H class Manager extends employee { 
protected $sal=5000; 

public function getParentSal(){ 
//這裡回傳的是父類的private屬性. 
return parcom::getager(); new Manager(); 
echo "PHP ".phpversion()."
"; 
echo $manager->getSal(); 
echo "
"; 
echo "parent's $sal ".$manager- >getParentSal(); 

?> 

程式運作結果: 
複製程式碼 程式碼如下: 
PHP 5.3.8 
5000 
parent's $prisal 500050所以$manager->getSal()這個父類別的方法呼叫的是父類別自己的私有屬性$sal 此時記憶體中有兩個$sal 
第二個欄位中父類別的protected $sal被重寫$manager ->getSal()這個父類別的方法呼叫已經被重寫的$sal 父類別的$sal在記憶體中是不存在的此時記憶體中只有一個$sal 
接下來看第三個列子 
子類別中重寫的方法對目前private有效。
複製程式碼 程式碼如下: 
 
class employee{ 
private $sal=3000; 
public function getSal(){ 
return $ 🜎 ate $sal =5000; 
//重寫過的方法 
public function getSal(){ 
return $this->sal; 

public function getParentSal(){ 
//這裡回傳的屬性是父類的parent::getSal(); 


$manager = new Manager(); 
echo "PHP ".phpversion()."
"; 
echo $manager->getSal(); br>"; 
echo "parent's $sal ".$manager->getParentSal(); 
?> 

運行結果 
複製碼 程式碼如下: 
PHP 5.3.8 
複製程式碼 程式碼如下: 
PHP 5.3.8 
複製碼 程式碼如下: 
PHP 5.3.8 
複製碼子類別重寫getSal()方法所以他呼叫的是子類別的屬性 
如果你註解子類別的這一行 
//private $sal=5000; 
你會發現一個錯誤:Notice: Undefined property: Manager:: $sal in E:wampwwwoo2-52-5-3.php on line 14 
如果註解掉12行的子類別重寫方法那麼echo $manager->getSal();得到的結果是父類別的私有屬性$sal 3000 

開啟zend調試狀態看看,記憶體中的狀況。注意最下面,有兩個$sal 。分別是 3000 和 5000 。
複製代碼 代碼如下: 
 
class employee{ 
private $sal=3000; 
public function getSal(){ 
return $this->sal; 


class Manager extends employee { 
protected $sal= 5000; 
public function getParentSal(){ 
return $this->sal; 


$manager = new Manager(); 
echo "PHP ".$manager = new Manager(); 
echo "PHP ".$manager = new Manager(); 
echo "PHP "。 ->getSal(); 
?> 

程式運作結果: 
複製程式碼 程式碼如下: 
PHP 5.3.8 
3000 

將父類別的屬性$sal 改為 protected ,子類別重寫了父類別的屬性。在記憶體中只有一個 $sal 。
複製代碼 代碼如下: 
 
class employee{ 
protected $sal=3000; 
public function getSal(){ 
return $this->sal; 


class Manager extends employee { 
protected $sal= 5000; 
public function getParentSal(){ 
return $this->sal; 


$manager = new Manager(); 
echo "PHP ".$manager = new Manager(); 
echo "PHP ".$manager = new Manager(); 
echo "PHP "。 ->getSal(); 

?> 

程式運作結果: 
複製程式碼 程式碼如下: 
PHP 5.3.8 
5000 

如果你學過任何java,你會覺得這一切都很難理解的。 
在Java中當子類別被創建時,父類別的屬性和方法在記憶體中都被創建,甚至構造函數也要被呼叫。 
PHP5不是這樣,PHP5呼叫父類別用的是parent:: 而不是 parent-> ,這足以說明PHP5不想在記憶體中讓父類別也被創建。 PHP5想讓繼承變的比Java簡單。 

適應下就好。 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn