2015-07-21 38 views
8

我一直在研究PHP7的新功能,並認爲我可能會開始爲我的項目準備好它引入的新功能,如標量類型提示。類型提示和多個構造函數

我遇到的第一個問題之一是我在各個類中的構造函數。我有一些類似這樣的通用控制器:

public function __construct($data = null) { 
    if (is_numeric($data)) { 
     $this->controller->createById($data); 
    } 
    elseif (is_array($data)) { 
     $this->controller->createByArray($data); 
    } 
    elseif (strlen($data) > 0) { 
     $this->controller->createByUrl($data); 
    } 
} 

引入此方法的類型提示當然會在各個方向上拋出錯誤。

據我所知PHP7並沒有引入對多個構造函數的支持。有什麼辦法可以解決這個問題嗎?或者這是這種語言的限制之一?

+4

不要爲該方法引入類型提示? –

+0

@ N.B。是的,我知道這是一種可能性,但來自OOP背景我真的很喜歡我的整個代碼庫是真正面向對象的) – OptimusCrime

+0

編程和OOP專門用於解決問題。你沒有任何需要通過編程解決的問題,你受到OCD的困擾,現在你錯誤地認爲OCD是語言限制。可悲的是,這不是語言限制。這只是你身邊的刺,因爲你有一些愚蠢的構造函數接受任何東西,現在你想通過3個構造函數鍵入提示什麼是值。那真的是「OOP」嗎?複雜,愚蠢的代碼解決沒有問題? –

回答

6

正確,這是該語言的侷限性之一。 (和strlen() > 0無論如何不能通過類型檢查。這會自動轉換爲字符串...所以你的方法允許一切,但「」,null和false?)

通常,草案中有RFC來擴展在7.1中打印PHP: https://wiki.php.net/rfc/union_types

這樣可以讓你編寫int | float | array | string $data = null

+0

是的,我很害怕。感謝您爲工會類型鏈接rfc。太糟糕了PHP不支持多個構造函數,儘管它可能會在將來的版本中出現,因爲它比以前更相關。無論如何,謝謝你明確回答我的問題。 – OptimusCrime

+1

函數重載(多重構造函數的泛化版本)並不真正來到PHP中,因爲它不可能解決衝突,特別是在弱類型化(不是嚴格類型)的情況下[或者我們需要複雜的規則什麼是優先級最終會混淆每個人...特別是'declare(strict_types = 1)'是調用者特定的......針對不同的打字模式的不同行爲?笏?!?。這就是爲什麼我們要採取聯盟類型的方式,這將允許你做什麼。 – bwoebi