2011-09-19 196 views
12

我需要一個父類來訪問其子屬性:訪問子屬性從父範圍

class Parent { 
    private $_fields = null; 

    public function do_something() { 
    // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    private $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

$_fields從子範圍修改,它仍然是在父範圍null。當試圖使用$this->child_var從父範圍訪問$ child_var時,它當然是未定義的。

我沒有找到像一個「功能設定」,將只在子類中被複制什麼...

+4

你可能想使性能'protected',而不是'private'。 –

回答

9

看看文章約visibility

基本上,您無法訪問父級的private屬性/方法,父級也無法訪問其子級。但是,您也可以聲明您的財產/方法protected

class Parent { 
    protected $_fields = null; 

    public function do_something() { 
     // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    protected $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 
+0

謝謝!那正是我所期待的。似乎我沒有閱讀足夠的文檔。 –

6

試圖從基(父)類訪問子值是一個糟糕的設計。如果將來有人會根據你的父類創建另一個類,忘記在你的父類中創建你試圖訪問的那個特定屬性?

如果你需要做這樣的事情,你應該建立在一個父類的屬性,然後將其設置在孩子:

class Parent 
{ 
    protected $child_var; 

    private $_fields = null;  
    public function do_something() 
    {  
     // Access $_fields and $child_var here 
     //access it as $this->child_var 
    } 
} 
class Child extends Parent 
{ 
    $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

基本上在你不應該引用特定的子內容的父母,因爲你不能確定它會在那裏!

如果你有,你應該使用抽象:

PHP Abstraction

+0

嗯,我知道這是一個不好的做法,但它確實需要它的一個非常具體的情況。無論如何感謝您的回答。 –

+0

我明白這個問題,但這個解決方案仍然讓我感到有風險。我們如何執行子類來定義某個屬性?我在抽象父類中有一個具體函數,它需要一定的屬性。現在我在父類中使用$ this-> childProperty,它運行但是突出顯示的問題相同。 –

+0

您可以創建'$ child_var'摘要。這將強制任何孩子實際執行它。 –