2 Новых экземпляра родительского и дочернего классов, необходимо изменить родительскую переменную непосредственно в parent и view в child

#php #class #variables #inheritance

#php #класс #переменные #наследование

Вопрос:

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:

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

 $this->varA = ‘something’;
  

Причина, по которой ваш дочерний метод не отражает изменения, заключается в том, что child и parent — это два разных объекта в отдельном пространстве памяти. Если вы хотите, чтобы они разделяли значение, вы могли бы это сделать 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());
  

И в методе set:

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

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

Комментарии:

1. Хорошо, я просто попытался установить ее как защищенную, но я не смог просмотреть изменение напрямую. Я понимаю, что создаю два разных экземпляра ParentClass, но я не могу придумать способ иметь 2 переменные, которые нацелены на ChildClass и ParentClass. В смысле кода, который я написал выше в вопросе.

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