2 Новые экземпляры класса Parent и Child, необходимо изменить переменную Parent непосредственно в parent и просмотреть в child - PullRequest
0 голосов
/ 12 июня 2011

PHP

Если я создаю новый экземпляр родительского класса и новый экземпляр дочернего класса, как я могу напрямую изменить переменную в родительском классе и просмотреть изменения в дочернем классе?

Возьмите следующий код:

class parentClass {

    public $varA = 'dojo';

    public function setVarA() {
        $this->varA = 'something grand';
    }

    public function getVarA() {
        return $this->varA;
    }

}

class childClass extends parentClass {

    public function useVarA() {
        echo parent::getVarA();
    }

}

$parentInstance = new parentClass();
$childInstance = new childClass();

$initialVarA = $parentInstance->getVarA(); // should set $initialVarA variable to 'dojo'

$childInstance->useVarA(); // should echo 'dojo'

$parentInstance->setVarA(); // should set $varA to 'something grand'

$changedVarA = $parentInstance->getVarA(); // should set $changedVarA variable to 'something grand'

$childInstance->useVarA(); // should echo 'something grand' but fails to do so...how can I do this?

1 Ответ

1 голос
/ 12 июня 2011

Если у вас есть переменная (член) private или protected в родительском элементе, вы можете просто получить к ней доступ, как у своего дочернего класса:

$this->varA = ‘something’;

Существует причина, по которой ваш дочерний метод не отражает изменения, заключается в том, что дочерний и родительский объекты - это два разных объекта в отдельном пространстве памяти. Если вы хотите, чтобы они разделяли значение, вы можете сделать это static.

Вам не нужно объявлять это public.

class Parent {
    private $varA;
    protected $varB;
    public $varC;

    protected static $varD;

    public function getD() {
        return self::$varD;
    }

    public function setD($value) {
        self::$varD = $value;
    }
}

class Child extends Parent {

    public function getA() {
        return $this->varA;
    }

    public function getB() {
        return $this->varB;
    }

    public function getC() {
        return $this->varC;
    }

 }

 $child = new Child();

 $child->getA(); // Will not work since $varA is private to Parent
 $child->getB(); // Works fine because $varB is accessible by Parent and subclasses
 $child->getC(); // Works fine but ...
 $child->varC;   // .. will also work.
 $child->getD(); // Will work and reflect any changes to the parent or child.

Если вы не хотите, чтобы все экземпляры родительского класса разделяли значения. Вы можете передать родительский или дочерний элемент либо новому экземпляру, либо соответствующим образом обновить значения всех связанных объектов.

$parent->addChild(new Child());

А в заданном методе:

$this->varA = $value;
foreach ($this->children as $child) {
     $child->setVarA($value);
}

Надеется, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...