如何访问子类中的父对象属性

时间:2011-06-09 12:47:29

标签: php

实际上,

这工作正常..但我想要父值。 不是孩子的价值..

<?php
    class Fruit{
        protected $parentproperty = "parentvalue";// this is parent value       
    }

    class Orange extends Fruit{
        protected $parentproperty = "child value";// here i mentioned once again        
        function showParentProperty(){
            return self::$this->parentproperty;
        }


    }
    $obj = new Orange;
    echo $obj->showParentProperty();

    //conclusion:
    // i want to get the parent value not child. its working fine . but it's displaying chid value


?>

7 个答案:

答案 0 :(得分:6)

如果你的意思是:

class Fruit {
    protected $parentproperty = "parent value";
}

class Orange extends Fruit{
    protected $parentproperty = "child value";
    function showParentProperty(){
        return $this->parentproperty; // corrected syntax here
    }
}

然后没有办法做你想要的,因为PHP中的所有非静态类属性都是虚拟的。

如果父属性是静态的,您只能使用parent关键字,如下所示:

class Fruit {
    static $parentproperty = "parent value";
}

如果我们在讨论实例属性,那么你唯一能做的就是为子属性使用另一个名称。

答案 1 :(得分:2)

当您在子类中重写类属性$ parentproperty时,我认为父类的值丢失了。

答案 2 :(得分:2)

可以访问在子类中重写的父类的非静态属性的默认值:

class Orange extends Fruit
{
    protected $parentproperty = "child value";
    function showParentProperty()
    {
        $parentProps = get_class_vars(get_parent_class($this));
        return $parentProps['parentproperty'];
    }
}

这样,您可以访问父类的protectedpublic非静态属性,这在应用DRY原则时非常方便。

答案 3 :(得分:1)

我认为它会以这种方式运作。您可以做的是在父级中声明属性,然后只要子级扩展父级,就可以直接在子级中访问它们。然后,在子__constructor中调用父__constructor ...

class fruit{
   protected $name;
   protected $type;

   __constructor($name, $type){
     $this->name = $name;
     $this->type = $type;
   }//end __constructor

}//end class

class thisFruit extends fruit{
   __constructor($name, $type){
      parent::__constructor($name, $type);
   }
}

你会用它     $ myFruit = new thisFruit(&#34; Orange&#34;,&#34; Citrus&#34;);     echo&#34;这个水果是&#34;。$ myFruit-&gt;名称;

希望这会有所帮助 - 祝你好运!

答案 4 :(得分:0)

在你的孩子身上:

function showParentProperty()
{
    return parent::$parentproperty;
}

答案 5 :(得分:0)

在没有静态属性的情况下执行所要求的唯一方法是使用reflexion api

答案 6 :(得分:0)

也许尝试在父类中使用__get($ value)并通过
从子调用它 public function __get($value){ if($value == 'parentValue'){ return parent::__get($value); }else{ return $this->$value; } }
我在我目前的项目中使用它并且工作正常。
Kori