2011-10-26 82 views
13

爲什麼我不能使用這樣的代碼?爲什麼PHP沒有默認構造函數?

<?php 

class NoConstructor { 
} 

class ChildWithConstructor extends NoConstructor { 
    public function __construct() { 
     parent::__construct(); 
     // do something 
    } 
} 

$foo = new ChildWithConstructor(); 
// **Fatal error: Cannot call constructor in file.php on line 8** 

例如, Java類有默認的,沒有參數構造函數。即使未明確定義,也可以調用它。

當我們從父類中移除任何參數構造函數時,PHP行爲會導致麻煩,例如。當我們認爲它不再需要時。

有誰知道爲什麼PHP創造者這樣做?

+1

除了你的問題,應該提到你可以解決這個問題:在調用之前檢查函數的存在。 –

+6

PHP創建者做出了很多愚蠢的決定...... –

+1

http://www.php.net/manual/en/function.is-callable.php:if(is_callable('parent :: __ construct')){父:: __構建體(); } –

回答

20

Java類有默認,無參數的構造函數。

有誰知道爲什麼PHP創造者這樣做?

Java是有計劃的語言。這是從一開始就嚴格考慮和正式指定的。爲了向前和向後兼容,爲了簡單起見,開發人員和實施者都希望儘可能長時間保持最小的變化。絕對沒有達到他們希望的程度,但你仍然可以使用Java 1.0代碼,編譯它並在現代VM上運行它。

PHP的設計師從來沒有將語言規劃到接近這樣一個極端。他們一直這樣做。無論好壞,他們都會適度地將語言分開,並在下一個版本中重建它。從PHP 1和PHP 2開始,它已經無法識別地改變了。即使在最近的PHP 5中,對象的引用語義也是如此。這就是那種帶給我們神奇的引號,缺少Unicode,不一致地命名(並經常重命名)的函數以及即使沒有錯誤提示(甚至是error_reporting(-1);)的解析器的同樣精彩的方法也會快速地將數字文字09解釋爲0

當我們從父類中刪除任何參數構造函數時,PHP行爲會導致麻煩,例如。當我們認爲它不再需要時。

您可以要求將其在bugs.php.net改變,但很有可能他們會忽略或搪塞你了與「對不起,您的問題並不意味着PHP本身就是一個問題...... 「

+2

+1,這是解決這個問題的唯一答案。 – Brad

1

在PHP 5之前,構造函數與類有相同的名稱,比如JAVA。在PHP 5中,類可以具有與類相同名稱的構造方法(如果不在名稱空間中)或名爲__construct。 也許它與此有關。

4

正如我們看到的5.3.7 disaster,PHP開發可能需要更多的穩定性。除此之外,PHP在很多方面都有所不同。

  • 企業備份是不是在同一個聯盟(沒有甲骨文,沒有IBM等)
  • PHP是舊的,有時不一致
  • PHP解釋器(Zend引擎)必須能夠非常辦很多,通過支持如此多的遺留結構和編程範例。
  • PHP的起源是愛好者的簡單腳本語言。

我真的很喜歡PHP,並且每天都在使用它,但有時它只是一個小小的怪癖。另一方面,如果你刪除__construct(),你應該考慮兩件事情。

  1. 不會做那只是一句構造
  2. 如果您正在構建一個框架,使初始化函數的一個核心概念,因爲這些甚至是很好的做法。

我的意思是這樣的:

class BaseClass { 
    public function __construct() { 
     if(method_exists($this, 'init') { 
      $this->init(); 
     } 
    } 
} 
1

parent::__construct(); 

是父類的構造函數的顯式調用。 「PHP」給你一個錯誤,因爲它不存在。

你真的可以在Java中顯式調用一個父類的不存在的構造函數嗎?

請記住,構造擴展類時,擴展父類的類的構造函數將覆蓋父類的構造函數。調用父構造函數意味着你期待它做某件事。如果構造函數不存在,那麼對它的調用不屬於代碼,無論解釋器是否給出錯誤。

+0

在Java中,不存在沒有構造函數的類 - 如果編譯器沒有寫入源代碼,編譯器會添加一個類。請參閱https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9 – bdsl

相關問題