在子类中调用父构造函数

时间:2013-06-04 10:38:45

标签: php class oop constructor parent

任何人都可以解释一下为什么这段代码有效吗?

<?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

1 个答案:

答案 0 :(得分:1)

如果iParentChild类没有定义__construct,那么它继承了它的超类iParent中的那个。如果确实定义了__construct,那么它将覆盖父的构造函数,因此,如您的问题所述,需要调用parent::__construct()

修改

请注意,即使iParentChild 覆盖__construct而未调用父构造函数,此示例中也不会出现错误。这是因为php在使用它们的上下文中提供了变量的默认初始化,这里它们被用作字符串。在实践中,最好不要依赖于此:

From the PHP Manual - Basics

  

没有必要在PHP中初始化变量,但它是一个   非常好的做法。未初始化的变量的默认值为   它们的类型取决于它们的使用环境 - 布尔值   默认为FALSE,整数和浮点数默认为零,字符串(例如   在echo中使用)被设置为空字符串,数组变为空   阵列。

     

依赖于未初始化变量的默认值是   在将一个文件包含到另一个文件中使用的问题   相同的变量名称。它也是一个主要的安全风险   register_globals打开。如果发生E_NOTICE级别错误   使用未初始化的变量,但不是在   将元素附加到未初始化的数组。 isset()语言   构造可用于检测变量是否已经存在   初始化。

尝试在未初始化的成员对象上调用方法会导致错误。