2015-11-14 4 views
-1

Вот код:Как получить базовые атрибуты в дочернем классе?

<? php 
class Animal 
    {  
     public $type = 'Animal';  
     function printProperties() 
      { 
       echo $this->type; 
      } 
    } 

class Dog extends Animal 
    { 
     public $type = 'Dog'; 

     function printProperties() 
      { 
       echo $this->type.'<br>'; 
       parent::printProperties(); 
      } 

$aDog = new Dog; 
$aDog-> printProperties();  
?> 

код печатает Dog newl Dog

я ожидал выход быть Dog newline Animal. Как получить этот результат. Не могу ли я получить доступ к базовым атрибутам в классе achild, если я перезаписал свойство?

+0

это нечитаемое – Jah

+0

Вы переписываете '$ type' во втором классе, поэтому' Dog
Dog' ожидается. – Rasclatt

+0

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

ответ

0
<?php 
class foo { 
    var $x; 
    function foofoo() 
    { 
     $this->x = "foofoo"; 
     return; 
    } 
} 
class bar extends foo { 
    // we have var $x; from the parent already here. 
    function barbar() 
    { 
     parent::foofoo(); 
     echo $this->x; 
    } 
} 
$b = new bar; 
$b->barbar(); // prints: "foofoo" 
?> 

Источник: http://php.net/manual/en/keyword.parent.php

+0

Это не очень объясняет, почему он не работает, учитывая, что он назначает дополнительное значение в дочернем классе, в котором возникает его проблема. – Sir

+0

О, да, да, вы сделали доступ к переменной родительского класса в вашей попытке. $ this относится к родительскому классу. Однако он переопределяется переменной класса child. Пожалуйста, обратитесь к ссылке, которую я опубликовал, чтобы иметь лучшее понимание. Особенно эти комментарии ниже. –

+0

Я это прекрасно понимаю, я не задавал вопрос. Ваш ответ не объясняет, почему его назначение переменной не было установлено на правильное значение. Потому что вы не объяснили, что '$ this' будет принадлежать родительскому классу. Таким образом, он переписывал переменную. Ваш ответ - всего лишь фрагмент кода без контекста, чтобы объяснить поведение вывода, которое он получал. – Sir

0

Там нет такого понятия, как атрибуты родителя. Атрибуты являются частью экземпляра класса, то есть объекта. В этом смысле у вас есть один единственный атрибут «type» (который вы определили дважды). Переводчик присваивает ему значение, указанное в самом конкретном классе, которым вы являетесь, является экземпляром (говоря о наследовании), то есть Dog. Так как метод printProperties (оба варианта реализации, в родительском и в дочернем классе) печатает значение атрибута типа «тип», оба они выдают одно и то же значение (за исключением <br>).

Смежные вопросы