【问题标题】:Access a parent class property in the child class before using parent::__construct在使用 parent::__construct 之前访问子类中的父类属性
【发布时间】:2012-01-30 22:58:54
【问题描述】:

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

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

【问题讨论】:

    标签: php oop class inheritance properties


    【解决方案1】:

    如果您无论如何都在静态设置这些东西(即使用硬编码字符串),那么将其(至少是默认值)设为静态属性(甚至可能是类常量)。然后在子的构造函数中引用父的静态变量(也在父的构造函数中)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-30
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多