簡體   English   中英

在子類中調用父構造函數

[英]Calling parent constructor within child class

誰能解釋這個代碼為什么起作用?

<?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類未定義__construct則它將繼承其超類iParent中的一個。 如果確實定義了__construct則它將覆蓋父級的構造函數,因此,如您的問題所述,需要調用parent::__construct()

編輯

請注意,即使iParentChild 確實重寫了__construct而沒有調用父構造函數,在此示例中也不會出錯。 這是因為php在使用變量的上下文中提供了變量的默認初始化,在這里將它們用作字符串。 實際上,最好不要依賴於此:

從PHP手冊-基礎知識

不需要在PHP中初始化變量,但這是一個很好的做法。 未初始化變量的類型默認值取決於使用它們的上下文-布爾值默認為FALSE,整數和浮點默認為零,字符串(例如在echo中使用)設置為空字符串,並且數組變為空數組。

在將一個文件包含在另一個使用相同變量名的文件中的情況下,依靠未初始化變量的默認值是有問題的。 啟用register_globals也是主要的安全風險。 如果使用未初始化的變量,則會發出E_NOTICE級錯誤,但是如果將元素附加到未初始化的數組,則不會發出E_NOTICE級錯誤。 isset()語言構造可用於檢測變量是否已初始化。

嘗試在未初始化的成員對象上調用方法將導致錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM