2011-12-31 4 views
1

Childクラスでは、親プロパティ "$ this-> lang"にアクセスし、親を呼び出す前に他のプロパティに使用する必要がありますコンストラクタ再び、同じよう:parent :: __ constructを使用する前に子クラスの親クラスプロパティにアクセス

abstract class mySuperClass { 

    protected $lang; 

    public function __construct($arg1=null, $arg2=null, $arg3=null) { 
     $this->lang = "US"; 
    } 
} 

class myChild extends mySuperClass { 

    public function __construct($arg1=null, $arg2=null, $arg3=null) { 
     $new_arg1 = $this->lang; // HERE WE ARE STRUGGLYING ... 
     echo "<br/>step 1) ". get_class(). " : lang= $new_arg1 "; // returns "" where I would need "US" 
     parent::__construct($new_arg1 , $arg2, $arg3) ; 
     echo "<br/>step 2) ". get_class(). " : lang= $this->lang"; // returns "US" 

    } 
} 

$obj = new myChild("foo1", "foo2", "foo3") ; 

これは、親クラスは、我々は親プロパティの$ this - > LANGを呼び出そうとしているこの段階でインスタンス化されていないとして許さ/可能性は見えません。それは論理的だと思われる。

質問は次のとおりです。
子クラスの親プロパティにアクセスする方法はありますか?

答えて

2

とにかくこれらを静的に設定している場合(つまり、ハードコードされた文字列を使用する場合)、静的プロパティ(おそらくクラス定数でさえも)を(少なくともデフォルトの)ものにします。次に、子のコンストラクタ(親の場合も)の親のstatic varを参照します。

abstract class mySuperClass { 
    static protected $default_lang = "US";  
    protected $lang; 

    public function __construct($arg1=null, $arg2=null, $arg3=null) { 
     $this->lang = self::$default_lang; 
    } 
} 

class myChild extends mySuperClass { 

    public function __construct($arg1=null, $arg2=null, $arg3=null) { 
     $new_arg1 = parent::$default_lang; 
     echo "<br/>step 1) ". get_class(). " : lang= $new_arg1 "; 
     parent::__construct($new_arg1 , $arg2, $arg3) ; 
     echo "<br/>step 2) ". get_class(). " : lang= $this->lang"; // returns "US" 

    } 
} 

$obj = new myChild("foo1", "foo2", "foo3") ; 
+0

Thx、私を助ける良い説明です。 – hornetbzz

関連する問題