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

dar*_*a33 3 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
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢提前!

rdl*_*rey 5

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

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

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"
Run Code Online (Sandbox Code Playgroud)

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


FtD*_*Xw6 5

您可以使用反射来做到这一点:

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"    
Run Code Online (Sandbox Code Playgroud)