2015-11-14 42 views
-1

下面是代碼:如何訪問子類中的基本屬性?

<? php 
class Animal 
    {  
     public $type = 'Animal';  
     function printProperties() 
      { 
       echo $this->type; 
      } 
    } 

class Dog extends Animal 
    { 
     public $type = 'Dog'; 

     function printProperties() 
      { 
       echo $this->type.'<br>'; 
       parent::printProperties(); 
      } 

$aDog = new Dog; 
$aDog-> printProperties();  
?> 

代碼打印Dog newl Dog

我預計輸出爲Dog newline Animal。如何得到這個結果。如果覆蓋屬性,我不能訪問achild類中的基本屬性嗎?

+0

這是不可讀的 – Jah

+0

你在第二類中覆蓋'$ type',所以'Dog
Dog'是預期的。 – Rasclatt

+0

因此,如果我覆蓋父屬性,沒有辦法訪問子類中的基本屬性? – user5241471

回答

0
<?php 
class foo { 
    var $x; 
    function foofoo() 
    { 
     $this->x = "foofoo"; 
     return; 
    } 
} 
class bar extends foo { 
    // we have var $x; from the parent already here. 
    function barbar() 
    { 
     parent::foofoo(); 
     echo $this->x; 
    } 
} 
$b = new bar; 
$b->barbar(); // prints: "foofoo" 
?> 

來源:http://php.net/manual/en/keyword.parent.php

+0

這並不是真正的解釋爲什麼他不工作,因爲他在他的問題發生的孩子班級中分配了額外的價值。 – Sir

+0

哦,是的,它確實如此,你沒有在你的嘗試中訪問父類變量。 $這指的是父類。但是它被子類變量覆蓋了。請參考我發佈的鏈接,以便更好地理解。特別是下面的評論。 –

+0

我完全理解,我沒有問這個問題。你的回答並不能解釋爲什麼他的變量賦值沒有設置爲正確的值。因爲你沒有解釋'$ this'將屬於父類。因此他覆蓋了一個變量。你的答案只是一小段代碼,沒有上下文來解釋他得到的輸出行爲。 – Sir

0

父屬性有沒有這樣的事情。屬性是類的實例的一部分,即對象。從這個意義上說,你的對象有一個單一的屬性「類型」(你定義了兩次)。解釋器正在爲它分配最具體的類上指定的值,它是一個實例(說繼承),即Dog。 因此,作爲printProperties方法(這兩個實現,在父類和子類中)打印對象「類型」屬性的值,它們都會輸出相同的值(<br>除外)。