为什么没有构造函数方法,子类不能访问父类属性?

时间:2013-06-15 03:34:58

标签: php class oop

这可能是基础知识,但我很好奇,因为我自己还不知道。为什么在PHP(当然还有其他语言)中使用类时,子类必须使用构造方法来访问父类的属性。如果不清楚,我会举一个例子。

    <?php
     class aClass
      {
       protected $aProperty = "Some value";
      }
     class aDifferentClass extends aClass
      {
       public $aDifferentProperty;
       public function __construct()
        {
         $this->$aDifferentProperty = $this->aProperty;
      }
    ?>//Works.

而不是:

    <?php
     class aClass
      {
       protected $aProperty = "Some value";
      }
     class aDifferentClass extends aClass
      {
       public $aDifferentProperty = $this->$aProperty;
      }
    ?>//Doesn't work.

2 个答案:

答案 0 :(得分:1)

当你试图访问它时,它不是需要构造函数的问题。类是对象的蓝图 - 当您尝试分配属性时,就像您在上面的示例中所做的那样,即。

public $aDifferentProperty = $this->aProperty;

没有对象,因此“this”尚不存在。但是,相反,这将起作用:

class A {
  protected $a_property = "BOOYEA!";
}

class B extends A {
   public function show_me_a_prop() {
      echo $this->a_property;
   }
}

$object = new B();
$object->show_me_a_prop();

因此,要回答您的问题,您必须等到构造对象后才能访问属性,因为在构造之前,它不是对象,只是对象的蓝图。

现在,为了更进一步,你不允许将变量直接分配给属性(参见http://php.net/manual/en/language.oop5.properties.php),但你可以分配一个常量。所以这是一个类似的例子,它起作用了:

class A {
  const a_property = "BOOYEA!";
}

class B extends A {
   public $b_property = self::a_property;
}

$object = new B();
echo $object->b_property;

答案 1 :(得分:0)

“__construct”是在PHP5中引入的,它是定义构造函数的正确方法(在PHP4中,您使用了构造函数的类名)。

您不需要在类中定义构造函数,但是如果您希望在对象构造上传递任何参数,那么您需要一个。

另外......如果在轨道的下方更改了子类继承的类,则不必将构造调用更改为父级。

更容易调用parent::__construct()而不是parent::ClassName(),因为它可以在类之间重复使用,并且可以轻松更改父级。