2014-02-07 70 views
1

我需要訪問子類的函數內的父級屬性。一個靜態變量可以通過parent::訪問,但是當子類具有一個名稱相同的變量時,如何訪問非靜態父變量?面向對象的PHP繼承 - 訪問父級的屬性

class My_parent{ 
    $name = "Praeep"; 
} 

class My_child extends My_parent { 
    $name ="Nadeesha"; 

    function show_name() { 
    // need to access $name of the parent just referring the parent variable 
    } 
} 
+0

_「但我怎樣才能訪問一個非靜態的父變量,當子類有一個變量具有相同的名稱」_ - 這種要求如何是有意義的?如果子類有一個名稱相同的(非靜態)變量,這意味着你有_overwritten_它... – CBroe

回答

-2

將一個構造函數添加到您的父類中並在此函數內定義您的變量。

class My_parent{ 
    public $name; 
    public function __construct(){ 
    $this->name= "Praeep"; 
    } 
} 

如果你的子類也有一個構造函數,你需要手動調用父類構造函數。然而,一個類不必具有構造函數,所以我爲了簡單而對它進行了評論。

class My_child extends My_parent { 
    // public function __construct(){ 
    // parent::__construct(); 
    // } 
    public function show_name(){ 
    echo $this->name; 
    } 
} 

$c=new My_child(); 
$c->show_name(); 

編輯:

好,其實你並不需要在父類的構造函數。

class My_parent{ 
    public $name= "Praeep"; 
} 

class My_child extends My_parent { 

    public function show_name(){ 
    echo $this->name; 
    } 
} 

$c=new My_child(); 
$c->show_name(); 
+0

非常感謝,通過你提到的方法來訪問它是沒有問題的。但我想要的是,有沒有使用構造函數或任何方法來調用它的直接方式,例如在類變量中,類可以通過使用SELF ::來引用它自己,而父類使用父類:: – pradeep

+0

不是不可能的因爲你需要返回對象。 –

+0

非常感謝很多朋友 – pradeep

0

您可以聲明父類的變量和protected改性劑或提供一個getter。 getter方法將首選確保封裝。

class My_parent{ 
    private $name = "Praeep"; 
    public function getName() { 
     return $this->name; 
    } 
} 

class My_child extends My_parent { 
    public function show_name() { 
    echo $this->getName(); 
    } 
} 

如果您還希望該屬性是可變的,請考慮提供一個setter。