3

这可能是基本知识,但我很好奇,因为我自己还不知道。为什么在 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.
4

2 回答 2

1

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

public $aDifferentProperty = $this->aProperty;

没有对象,因此“这个”还不存在。但是,相反,这会起作用:

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;
于 2013-06-15T05:25:53.583 回答
0

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

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

另外...如果您更改子类继承的类,则不必更改对父类的构造调用。

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

于 2013-06-15T03:41:40.800 回答