Свойства, общие для дочернего и родительского класса в 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();