0

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

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

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

4

1 回答 1

1

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

编辑

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

来自 PHP 手册 - 基础

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

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

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

于 2013-06-04T10:44:55.530 回答