2015-11-14 43 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

哦,是的,它确实如此,你没有在你的尝试中访问父类变量。 $这指的是父类。但是它被子类变量覆盖了。请参考我发布的链接,以便更好地理解。特别是下面的评论。 –

+0

我完全理解,我没有问这个问题。你的回答并不能解释为什么他的变量赋值没有设置为正确的值。因为你没有解释'$ this'将属于父类。因此他覆盖了一个变量。你的答案只是一小段代码,没有上下文来解释他得到的输出行为。 – Sir

0

父属性有没有这样的事情。属性是类的实例的一部分,即对象。从这个意义上说,你的对象有一个单一的属性“类型”(你定义了两次)。解释器正在为它分配最具体的类上指定的值,它是一个实例(说继承),即Dog。 因此,作为printProperties方法(这两个实现,在父类和子类中)打印对象“类型”属性的值,它们都会输出相同的值(<br>除外)。