这可能是基础知识,但我很好奇,因为我自己还不知道。为什么在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.
答案 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()
,因为它可以在类之间重复使用,并且可以轻松更改父级。