Получите доступ к свойству родительского класса в дочернем классе перед использованием конструкции parent :: __ - PullRequest
1 голос
/ 31 декабря 2011

В классе 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. Что кажется логичным.

Так что вопрос:
Есть ли способ получить доступ к родительскому свойству в дочернем классе с помощью переопределения конструктора, как показано?

1 Ответ

2 голосов
/ 02 августа 2012

Если вы все равно статически устанавливаете эти вещи (т. Е. Используете жестко запрограммированные строки), то сделайте его (по крайней мере, по умолчанию) статическим свойством (возможно, даже константой класса). Затем обратитесь к статической переменной родительского элемента в конструкторе дочернего элемента (и в родительском конструкторе тоже)

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") ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...