Почему дочерний класс не может наследовать свойства класса, которые задаются динамически? - PullRequest
0 голосов
/ 10 января 2020

Наследование свойств возможно, когда свойство жестко закодировано. См. Ниже:

class ParentObj {   

    protected $familyName = 'Lincoln';   

}   

class ChildObj extends ParentObj {   

    public function __construct() {   
        var_dump($this->familyName);  
    }   
}   

$childObj = new ChildObj();   

// OUTPUT 
string 'Lincoln'

Наследование свойств невозможно, если свойство является динамическим c. См. Ниже:

class ParentObj {   

    protected $familyName; 

    public function setFamilyName($familyName){  
        $this->familyName = $familyName;  
    } 

}   

class ChildObj extends ParentObj {   

    public function __construct() {   
        var_dump($this->familyName);  
    }   
}   

$familyName = 'Lincoln';  
$parentObj = new ParentObj();  
$parentObj->setFamilyName($familyName); 

$childObj = new ChildObj(); 

// OUTPUT
null

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

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Ребенок наследует свое начальное состояние от родительского класса. Он не наследуется от конкретного экземпляра родительского объекта.

В первом примере «Линкольн» применим к всем ParentObject созданным экземплярам. Во втором примере это применимо только к бетону $parentObj. Вы устанавливаете его специально для этого экземпляра.

См. Мой ответ Что такое класс в PHP? для более подробного объяснения.

1 голос
/ 10 января 2020

Если вы хотите получить доступ к значению $familyName из всех экземпляров (объектов), вы можете определить $familyName как stati c, т.е. создать глобальную переменную класса.

например,

<?php

class ParentObj {

    protected static $familyName;

    public function setFamilyName($familyName){
        self::$familyName = $familyName;
    }

}

class ChildObj extends ParentObj {

    public function __construct() {
        var_dump(self::$familyName);
    }
}

$familyName = 'Lincoln';
$parentObj = new ParentObj();
$parentObj->setFamilyName($familyName);
$childObj = new ChildObj(); // Output: Lincoln

$familyName = 'Lee';
$parentObj->setFamilyName($familyName);
$childObj = new ChildObj(); // Output: Lee

Внимание! $familyName теперь является глобальным и будет изменяться для всех экземпляров этого объекта. Это может привести к неожиданным результатам, если вы когда-нибудь измените значение в скрипте. Глобальные переменные обычно считаются плохой идеей.

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