首頁  >  文章  >  後端開發  >  有關php類別的private屬性繼承問題詳解

有關php類別的private屬性繼承問題詳解

WBOY
WBOY原創
2016-07-25 09:03:46892瀏覽
  1. class employee{
  2. private $sal=3000;
  3. //protected $sal=3000;
  4. public function getSal(){
  5. return $this->sal;
  6. }
  7. }
  8. class Manager extends employee {
  9. protected $sal=5000;
  10. protected $sal=5000;
  11. public function getParentSal(){

  12. //這裡回傳的是父類別的private屬性.
  13. return parent::getSal();
  14. }
  15. }
  16. $manager = new Manager();
  17. echo "PHP ".phpversion()."
    ";
  18. echo $manager->getSal();
  19. echo "
    ";
  20. echo "parent's $sal ".$manager->getParentSal();
?>
複製程式碼

程式運作結果: PHP 5.3.8 3000 parent's $sal 3000

如果父類別中的屬性被子類別重寫了。 結果是這樣的。注意 第5行的屬性定義變成了protected。
  1. class employee{
  2. //private $sal=3000;protected 3000;
  3. public function getSal(){
  4. return $this->sal;
  5. }
  6. }
  7. class Manager extends employee {

  8. protected $sal =5000;
  9. public function getParentSal(){

  10. //這裡回傳的是父類別的private屬性.
  11. return parent::getSal();
  12. }
  13. }
  14. $manager = new Manager();
  15. echo "PHP ".phpversion()."
    ";
  16. echo $manager->getSal();
  17. echo "";
  18. echo "parent's $sal ".$manager->getParentSal();
  19. ?>
複製代碼

程式運行結果: PHP 5.3.8 5000 parent's $sal 5000

第一列子中父類別的private $sal沒有被重寫所以$manager->getSal()這個父類別的方法呼叫的是父類別自己的私有屬性$sal 此時記憶體中有兩個$ sal 第二個列子中父類別的protected $sal被重寫$manager->getSal()這個父類別的方法呼叫已經被重寫的$sal 父類別的$sal在記憶體中是不存在的此時記憶體中只有一個$sal 接下來看第三個列子 子類別中重寫的方法對目前private有效。
  1. class employee{
  2. private $sal=3000;
  3. publicloyee{
  4. private $sal=3000;
  5. public function getSal(){ function
  6. return $this->sal;
  7. }
  8. }
  9. class Manager extends employee {

  10. private $sal=5000;
  11. //重寫過的方法
  12. public function getSal(){
  13. return $this->sal;
  14. }
  15. public function getParentSal(){
  16. //這裡回傳的是父類的private屬性.
  17. return parent::getSal();
  18. }
  19. }
  20. $manager = new Manager();
  21. echo "PHP ".phpversion()."
    ";
  22. echo $manager->getSal();
  23. echo "
    ";
echo "parent's $sal ".$manager->getParentSal();
?>

複製程式碼

運行結果 PHP 5.3.8 5000 parent's $sal 3000

這個列子中子類別重寫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 。
  1. class employee{
  2. private $sal=3000;
  3. public function getSal(){
  4. ->sal;
  5. }
  6. }
  7. class Manager extends employee {
  8. protected $sal=5000;
  9. public function getParentSal(){
  10. return $this->sal;}
  11. }
  12. $manager = new Manager();
  13. echo "PHP ".phpversion()."
    ";
echo $manager->getSal();
?>
複製程式碼

程式運作結果: PHP 5.3.8 3000

將父類別的屬性$sal 改成 protected ,子類別重寫了父類別的屬性。在記憶體中只有一個 $sal 。
  1. class employee{
  2. protected $sal=3000;
  3. public function getSal(){sal;
  4. }
  5. }
  6. class Manager extends employee {
  7. protected $sal=5000;
  8. public function getParentSal(){
  9. return $this->sal;}
  10. }
  11. $manager = new Manager();
  12. echo "PHP ".phpversion()."
    ";
  13. echo $manager->getSal();
  14. ?>
複製程式碼

程式運作結果: PHP 5.3.8 5000 注意: PHP5呼叫父類別用的是parent:: 而不是 parent-> ,這足以說明PHP5不想在記憶體中讓父類別也被創建。 PHP5想讓繼承變的比Java簡單。



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