Свойства, общие для дочернего и родительского класса в php

class parents{
    public $a;
    function __construct(){
        echo $this->a;
    }
}
class child extends parents{
   function __construct(){
        $this->a = 1;
        parent::__construct();
    }
}
$new = new child();//print 1

Этот код выше print 1, что означает, что всякий раз, когда мы создаем экземпляр дочернего класса и присваиваем значение свойствам, унаследованным от его родителя, свойство в его родительском классе также присваивается. Но код ниже показывает другое:

class parents{
    public $a;
    function test(){
        $child = new child();
        echo $this->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();//print nothing

Где я присваиваю значение его дочернему классу, а у родителя не было значения, назначенного его дочернему классу, почему?

Спасибо!

5 ответов

Решение

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

В нижнем примере у вас есть два отдельных объекта, действующих независимо. У родительского объекта есть $ a, как и у дочернего, но они не совпадают с $ a, поскольку они содержатся в отдельных объектах. поэтому, когда вы печатаете $this->a в родительском классе, он ссылается на экземпляр родительского объекта $ a, тогда как, если вы укажете $ a после установки $this->a =1 в дочернем классе, он отобразит дочерний экземпляр $ а.

Надеюсь, это прояснило некоторые вещи для вас.

Вы смешиваете состав объекта и наследование классов.

Наследование (реализуемое через ключевое слово extends) определяет is a отношения.

Композиция определяет has a отношения.

Чтобы проиллюстрировать эту концепцию, мы начнем с наследования.

class Person {
    public $name;
    public function talk(){};
    public function poop(){};
}

class Parent extends Person {
    public function __construct($name) {
        $this->name = $name;
    }
}

class Child extends Person {
    public function __construct($name){
        $this->name = $name;
    }
}

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

Например:

$parent = new Parent("Homer");
$child = new Child("Bart");
$parent->talk();
$child->poop();

Композиция используется, когда вы хотите реализовать отношения. Давайте пересмотрим наше определение типа Parent.

class Parent extends Person {
    public $children = array();

    public function __construct($name) {
        $this->name = $name;
    }
    public function addChild(Child $child){
        $this->children[] = $child;
    }
}

Что у нас сейчас есть, если для родителя have a ребенок.

$parent = new Parent("Homer");
$child = new Child("Bart");
$parent->addChild($child);
// now I can access homers first child
echo $parent->children[0]->name;

Когда вы создаете экземпляр parent, случай child создано расширяет parent класс с к test() функция. Тем не менее, это не меняет значение $a,

Это потому, что в первом примере вы создаете экземпляр

$new = new child();//print 1

а во втором ты инстанцируешь родителей

$new = new parents();

Вторая работает так же, как и первая, используя $new = new child();

Если вы хотите получить доступ к $a путем создания экземпляра child (), вам нужно сделать это следующим образом:

class parents{
    public $a;
    function test(){
        $child = new child(); //CHANGE HERE
        echo $child->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();

Это происходит потому, что у вас есть два разных экземпляра, которые не имеют ничего общего (кроме наследования..) Поведение, за исключением которого вы можете генерировать внутренние классы - которые php не поддерживает.

Если вы хотите поделиться var accros каждый экземпляр, вы должны сделать его статическим

class parents{
    public static $a;
    function test(){
        $child = new child();
        echo self::$a;
    }
}

class child extends parents{
    function __construct(){
        self::$a = 1;
    }
}
$new = new parents();
$new->test();

что, вероятно, не то, что вы хотите. Или ты точно скажешь, где хочешь сменить вар

class parents{
    public $a;
    function test(){
        $child = new child();
        echo $child->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();
Другие вопросы по тегам