如何使用parent :: method访问父类中的Variable

时间:2013-02-14 09:10:25

标签: php

我在Parent Class.i中有受保护的变量UserId我将在我的子类中扩展变量,如下所示

class Main
{
  protected $UserId          = "151";
  protected static $UserName = "Madhavan";      

  protected function SampleMethod()
  {
    print "This is Sample Method";
  } 
}


class SubMain extends Main
{   
  function __construct()
  {    
    print parent::SampleMethod();

    print "User Id is ".$this->UserId."<br/>";          
    print parent::$UserName;
    print "User Id is ".parent::$UserId."<br/>";            
  }
}

当我使用 $ this-&gt; UserId 时打印正常。但是当我使用Parent :: $ UserId时显示错误

致命错误:访问未声明的静态属性:Main :: $ UserName

为什么它没有显示由 parent :: SampleMethod()访问的函数,因为该函数不是静态的。

4 个答案:

答案 0 :(得分:3)

范围解析运算符::有时会以非显而易见的方式运行。当应用于常量或变量时,它总是以静态方式解析。

但是,当应用于函数时,被调用者的执行上下文取决于调用者代码的执行上下文;上下文没有改变。

例如,这没有任何警告就可以正常工作:

class Test
{
  private $a = 123;

  public function __construct()
  {
    Test::test();
    self::test();
  }

  public function test()
  {
    echo $this->a;
  }
}

new Test();

调用self::test()Test::test()都以非静态方式运行,因为__construct()是非静态调用的,并且您引用的是同一个类。

要引用任何实例变量,例如上例中的$a,需要使用$this->

答案 1 :(得分:1)

这是因为函数是可覆盖的(因此同名的旧版本共存)而属性不是(声明只是相互覆盖,属性不应在后代类中重新声明)。如果属性为$this->(如果它不是静态的),则始终访问该属性的唯一实例;如果属性为静态,则始终self::。 (如果在多个祖先类中声明了属性,则仍然只存在一个数据字段,因此您不能引用任何“其他”或“之前的”。)

答案 2 :(得分:0)

如果未激活E_STRICT,您将不会收到错误,否则您将得到以下内容:

严格标准:非静态方法parent :: SampleMethod()不应在...中静态调用...

答案 3 :(得分:0)

您可以使用self关键字以self::$UserName属性(已定义的属性)访问它,而不是使用父级。如果你想在子类中达到它的值(因为覆盖它),可以通过final::$UserName访问它(称为后期静态绑定)