任何人都可以解释一下为什么这段代码有效吗?
<?php
class iParent
{
private $device;
private $browser;
public function __construct()
{
$this->device = 'iPad';
$this->browser = 'Safari';
}
public function getDetails()
{
return 'Device ' . $this->device . ' ' . 'Browser ' . $this->browser;
}
}
/**
*
*/
class iParentChild extends iParent
{
public function __construct()
{
echo 'IParentChild constructor';
}
public function display()
{
return $this->getDetails();
}
}
$obj = new iParentChild;
echo $obj->display();
// Output
Device iPad Browser Safari
我认为只有在parent::__construct()
的构造函数中调用iParentChild
(初始化父构造函数)时才能工作。
// UPDATE 我在iParentChild中添加了__construct
答案 0 :(得分:1)
如果iParentChild类没有定义__construct
,那么它继承了它的超类iParent中的那个。如果确实定义了__construct
,那么它将覆盖父的构造函数,因此,如您的问题所述,需要调用parent::__construct()
。
修改
请注意,即使iParentChild 覆盖__construct
而未调用父构造函数,此示例中也不会出现错误。这是因为php在使用它们的上下文中提供了变量的默认初始化,这里它们被用作字符串。在实践中,最好不要依赖于此:
没有必要在PHP中初始化变量,但它是一个 非常好的做法。未初始化的变量的默认值为 它们的类型取决于它们的使用环境 - 布尔值 默认为FALSE,整数和浮点数默认为零,字符串(例如 在echo中使用)被设置为空字符串,数组变为空 阵列。
依赖于未初始化变量的默认值是 在将一个文件包含到另一个文件中使用的问题 相同的变量名称。它也是一个主要的安全风险 register_globals打开。如果发生E_NOTICE级别错误 使用未初始化的变量,但不是在 将元素附加到未初始化的数组。 isset()语言 构造可用于检测变量是否已经存在 初始化。
尝试在未初始化的成员对象上调用方法会导致错误。