在Child类中,我需要访问父属性“$ this-> lang”并将其用于其他属性,然后再次调用父构造函数,如:
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-&gt; lang的这个阶段,父类没有实例化。这似乎是合乎逻辑的。
所以问题是:
有没有办法访问子类中的父属性,如图所示使用构造函数覆盖?
答案 0 :(得分:2)
如果你是静态地设置这些东西(即使用硬编码的字符串),那么使它(至少是默认的)静态属性(甚至可能是类常量)。然后在子元素的构造函数中引用父元素的静态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") ;