請仔細看這句話 如果父類別有私有的屬性。那麼父類別的方法只為父類別的私有屬性服務。
下面透過一系列列子來加深理解.
這個例子看起來很奇怪,在子類別中重新定義了一個屬性$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簡單。