【问题标题】:Calling parent constructor within child class在子类中调用父构造函数
【发布时间】:2013-06-04 10:38:44
【问题描述】:

谁能解释一下为什么这段代码有效?

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

我认为只有在iParentChild 的构造函数中调用parent::__construct()(初始化父构造函数)才能工作。

//更新 我在 iParentChild 中添加了 __construct

【问题讨论】:

  • 究竟有什么困惑?您没有指定 iParentChild 构造函数,因此它继承了父类的构造函数。就这么简单。

标签: php class oop constructor parent


【解决方案1】:

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

编辑

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

From the PHP Manual - Basics:

在 PHP 中不需要初始化变量,但它是 很好的做法。未初始化变量的默认值为 它们的类型取决于使用它们的上下文 - 布尔值 默认为 FALSE,整数和浮点数默认为零,字符串(例如 在 echo 中使用)设置为空字符串,数组变为空 数组。

依赖于未初始化变量的默认值是 在将一个文件包含到另一个使用 相同的变量名。这也是一个重大的安全风险 register_globals 开启。在以下情况下发出 E_NOTICE 级别错误 使用未初始化的变量,但不是在 将元素附加到未初始化的数组。 isset() 语言 构造可用于检测变量是否已经 初始化。

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

【讨论】:

  • 请查看更新版本。我在 iParentChild 中添加了 __construct 但我仍然没有收到任何错误。
  • 我复制了你的代码和我得到的输出,正如预期的那样:IParentChild constructorDevice Browser
  • 是的,但现在我在 iParentChild 中有构造函数。当 this->getDetails() 被执行时,我预计会得到一个错误,因为父构造函数没有被初始化。
  • 编辑答案以提供进一步解释
猜你喜欢
  • 2018-02-28
  • 2018-01-31
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多