在使用parent :: __ construct之前,访问子类中的父类属性

时间:2011-12-31 04:26:17

标签: php oop class inheritance properties

在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的这个阶段,父类没有实例化。这似乎是合乎逻辑的。

所以问题是:
有没有办法访问子类中的父属性,如图所示使用构造函数覆盖?

1 个答案:

答案 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") ;