2013-12-11 9 views
1

我不確定這是否可能,但在此處。我想從子類中設置受保護變量的值,然後從父類訪問該值。這是我曾嘗試:在子類中設置受保護的變量值並在父級中訪問值

class A { 
    protected $a; 

    public function __construct() { 
     new B; 

     echo "Parent Value: {$this->a}"; 
    } 

    protected function setter($value) { 
     $this->a = $value; 
    } 
} 

class B extends A { 
    public function __construct() { 
     $this->setter('set value'); 

     echo "Child Value: {$this->a}<br />"; 
    } 
} 


new A; 

我期待上面的代碼輸出爲:

Child Value: set value 
Parent Value: set value 

但是我得到的,而不是以下:

Child Value: set value 
Parent Value: 

是它可以從子類中設置受保護變量的值,然後在父類中訪問該值?如果不是,我會如何實現這一目標?

回答

1

您可以設置該值並從子類訪問而不會出現任何問題 - 當您在A類構造函數中生成B類對象時,實際上是這樣做的 - 但代碼的問題在於您是生成父對象,並在該父對象的構造函數中生成子類的新對象。

所以發生的是:

  • 您生成一個A對象時,A運行類的構造函數;
  • 在構造函數中,生成B對象。 這是一個新對象,與您當前的A對象無關;
  • B對象的構造函數用於設置值並回顯它(基本回答您自己的問題),輸出的第一行如預期;
  • 繼續在A對象的構造函數中,丟棄生成的B類對象並回顯$this->a的值,但未爲該對象設置該值,因此您什麼都得不到。

我有點困惑爲什麼你想要在父項的構造函數中構造一個子對象。通常我會構造一個B對象,並在該對象的構造函數中,首先在調用B特定的東西之前調用父構造函數。

+0

我只是在學習OOP的概念。是否有可能以另一種方式完成我想要做的事情? –

+0

@MeisamMulla你究竟想要完成什麼?請注意,您已經完成了在子類中設置和使用父類的變量。 – jeroen

+0

我想在子類中設置'$ a'的值,然後從父類訪問相同的值。至於爲什麼,我只是玩弄一些概念。 –

相關問題