[英]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中初始化變量,但這是一個很好的做法。 未初始化變量的類型默認值取決於使用它們的上下文-布爾值默認為FALSE,整數和浮點默認為零,字符串(例如在echo中使用)設置為空字符串,並且數組變為空數組。
在將一個文件包含在另一個使用相同變量名的文件中的情況下,依靠未初始化變量的默認值是有問題的。 啟用register_globals也是主要的安全風險。 如果使用未初始化的變量,則會發出E_NOTICE級錯誤,但是如果將元素附加到未初始化的數組,則不會發出E_NOTICE級錯誤。 isset()語言構造可用於檢測變量是否已初始化。
嘗試在未初始化的成員對象上調用方法將導致錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.