2011-06-23 191 views
28
class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    } 
} 

$test = new B($some); 
$test->childfunction(); 

問題: 如何在子顯示父變量? 預期結果將回聲「父BB」PHP訪問父類變量

回答

50
echo $this->bb; 

變量被繼承並且不是私有的,因此它是當前物體的一部分。


這裏是爲了響應您的要求有關使用parent::更多信息,其他信息:

使用parent::當你想添加額外的功能,以從父類的方法。例如,假設一個Airplane類:

class Airplane { 
    private $pilot; 

    public function __construct($pilot) { 
     $this->pilot = $pilot; 
    } 
} 

現在假設我們要創建一個新的類型的飛機也有一個導航儀。您可以擴展__construct()方法來添加新的功能,但仍使用由母公司提供的功能:

class Bomber extends Airplane { 
    private $navigator; 

    public function __construct($pilot, $navigator) { 
     $this->navigator = $navigator; 

     parent::__construct($pilot); // Assigns $pilot to $this->pilot 
    } 
} 

通過這種方式,你可以按照發展DRY principle但仍提供所有您想要的功能。

+0

因此,這意味着**父**關鍵字只用於訪問父方法? – Kuntau

+1

通常,當你想覆蓋父方法時,你會使用parent ::,但仍然引用父代的功能。如果你只是想調用父節點的方法,你可以像變量一樣進行:'$ this-> parentmethod()' –

1

$ bb現在已經成爲B類的私有成員,它在將A保護起來後延伸出來。

所以喜歡它,你訪問$ BB的B類的屬性

class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo $this->bb; 
    } 
} 

$test = new B($some); 
$test->childfunction(); 
+0

哪一個是正確的$ this - > $ bb或$ this-> bb? – Kuntau

+0

@kuntau哎呀,錯字。 $這個 - > BB;是正確的。我修好了它。 – FinalForm

4

只是呼應它,因爲它繼承了

echo $this->bb; 
0

所有屬性和父類的方法是繼承了子類,所以理論上你可以在子類中訪問它們,但要小心在你的類中使用protected關鍵字,因爲它在子類中使用時會引發致命錯誤。
php.net

提到的屬性或方法 的知名度可以通過在前面的 聲明與公衆的關鍵字, 保護或私有定義。隨處可見 宣佈公開的類成員 。聲明保護 的成員只能在類 本身以及繼承類和父類 類中訪問。聲明爲私人的成員 只能由 定義成員的類訪問。

+0

'protected'在繼承類和父類中使用時不會拋出錯誤。 – T30

3

使用parent::$bb;您嘗試檢索使用值$bb定義的靜態常量。

相反,這樣做:

echo $this->bb; 

注:你不需要調用parent::_construct如果B調用它的唯一的類。不要在B類中聲明__construct。

5
class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo parent::$this->bb; //works by M 
    } 
} 

$test = new B($some); 
$test->childfunction();` 
+3

'parent :: $ this-> bb'必須是我見過的最瘋狂的面向對象的語法 – Tobia

+0

'parent ::'在'parent :: $ this-> bb'中實現的不過是讓人困惑而已。我建議刪除或進一步解釋,以減少答案的複雜性。 – SEoF