2012-06-28 115 views
5

我一直在尋找通過PHP文件,看到一些意見,其中一個變量是一個類的構造函數之外初始化,類似以下內容:初始化PHP構造函數之外的變量

classMyClass { 
    private $count = 0; 

    public function __construct() { 
     //Do stuff 
    } 
} 

PHP對象,模式,和練習,作者建議僅將結構用於屬性的初始化,將任何繁重或複雜的邏輯推遲到專門的方法。本教程(我在Google上找到的一個簡單示例)也建議使用構造函數來初始化屬性:http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php

爲什麼要在構造函數外初始化一個變量?這只是草率的編碼,還是有理由做這樣的事情?我不得不說,直到最近,我還是在構造函數之外初始化了默認值,並且似乎沒有任何一種方式的優勢。

+2

這只是一個很好的編程習慣。 – Brian

+0

當你只想初始化簡單變量時,很清楚在構造函數外部執行它,對於更復雜的初始化,使用構造函數 –

+0

您發佈的示例爲$ count變量提供了默認值。提供一個默認值是一個不錯的主意 - 通過這種方式,您將知道要測試什麼,以確定您的構造函數或其他地方的賦值是否成功。 – blearn

回答

5

當你在構造函數外初始化一個變量時,它必須被初始化爲常量。你不能做任何操作來初始化它。因此,該成員的初始值實際上是類簽名的一部分。

例如,這是無效的:

private $var = $othervar; 
private $var = func(); 

你能做到這一點在構造函數中爲好,但它是一個有點冗長,並添加一些雜亂的構造,除非有某種邏輯繼續。

+0

所以沒有理由不*初始化構造函數以外的變量,如果它們被分配了一個已知的值,比如一個字符串? – Nate

2

以上回答的評論,但請細說了一點:

既然是推薦使用的唯一屬性初始化構造函數,

誰說這一點,爲什麼呢?我假設只有涉及比默認值的屬性定義以外的東西。


的回答部分:

默認情況下在PHP變量不需要定義,因爲當在寫方面首次訪問變量然後被定義。所有的變量,包括未定義的那些包含NULLDemo):

class A {} 

$a = new A; 

var_dump($a->property); # NULL 

介紹類變量(屬性)PHP然後讓其真正定義變量。那些仍然在默認情況下返回NULL,但他們定義Demo):

class A { 
    public $property; 
} 

$a = new A; 

var_dump($a->property); # NULL 

在演進的下一步,這語言結構也允許指定一個常量表達式。這是恆定的,因爲定義是編譯時(不是調用構造函數時的運行時)。一個例子(Demo):

class A { 
    public $property = 'hello'; 
} 

$a = new A; 

var_dump($a->property); # string(5) "hello" 

由於這是編譯期,但你的構造函數運行時,我覺得很難兩種功能,以相互比較。也不清楚爲什麼你說建議通過構造函數進行初始化。

+0

請查看我對我的問題的更新 - 我添加了關於該聲明的信息。 – Andrew

+0

好吧:一個名爲「Killer PHP」的網站和標語「PHP設計師網站教程」可能不會像你想知道的那樣深入細節。在定義對象屬性時我看不到任何錯誤。你可以稍後初始化,但你應該定義它們。如果它們的初始值應該與「NULL」不同,但是是一個常量表達式,則用初始值來定義它們。這沒有錯。事實上,它使得你的構造函數更加複雜,這是一件好事。建設者應該是愚蠢的,不應該做太多。 – hakre

+0

謝謝。我主要感到困惑,因爲我已經看到了很好的代碼,主要是在構造函數之外使用初始化編寫的,但似乎大部分我讀過的東西都建議在構造函數中進行初始化。我可以看到它是如何不那麼混亂(這是足夠的理由),但我還沒有發現任何其他PHP的實際優勢,因爲在構造函數外設置實例屬性的默認值。謝謝你的深思熟慮的答案。 – Andrew

0

遠非馬虎......這是很好的編程習慣。正如您在Java/C++中所做的那樣,它只是設置它們,然後您可以在構造函數中進行任何初始化 - 通常會將它們發送到非默認值。