是否有可能获得父类的重写NON静态成员变量的值?

时间:2012-01-23 17:40:52

标签: php

是否可以获取父类的重写NON静态成员变量的值?

据我所知,要获取STATIC成员变量的值,请使用self :: $ var1或ClassName :: $ var1,但是如何获取NON静态成员变量的值?

例如......

class One
{
public $var1 = 'old var';
}

class Two extends One
{
    public $var1 = 'new var';

    public function getOldVar()
    {
        //somehow get old var
    }
}

非常感谢!

2 个答案:

答案 0 :(得分:5)

不。一旦你覆盖了非静态属性值,它就消失了。您不能像使用方法那样将parent::语法与非静态属性一起使用。

但是,使用static关键字可以利用PHP的后期静态绑定功能来访问 static 父属性,因为静态值绑定到分配它们的类:

class Top
{
  public static $prop = 'Parent';
}

class Child extends Top {
  public static $prop = 'Child';

  public static function getParentProp() {
    return parent::$prop;
  }

  public static function getProp() {
    return static::$prop;
  }
}

echo Child::getParentProp(); // outputs "Parent"
echo Child::getProp();       // outputs "Child"

请注意,您不能使用子类中的静态属性覆盖非静态属性以实现您正在尝试的内容,因为PHP(以及所有其他脚本语言,我相信)使用相同的表来存储属性名称。这只是语言的限制。

答案 1 :(得分:4)

您可以使用反射执行此操作:

class One {
    public $var1 = 'old var';
}

class Two extends One {
    public $var1 = 'new var';

    public function getOldVar() {
        $ref = new ReflectionClass(get_parent_class());
        $props = $ref->getDefaultProperties();
        return $props['var1'];
    }
}

$two = new Two;
var_dump($two->getOldVar());  // string(7) "old var"