2013-01-24 24 views
1

我的問題很簡單,我看到這個代碼在一個類:OOP,直接添加類變量的一類,沒有定義它們之前

class controller_activity { 
    function __construct($args) { 
     //the variable template is not defined or what happen?? 
     $this->template = new Template('activity');  
    } 
    ....... 

通常我看到的變量聲明一個類像「公共$模板「或類似的,但這種情況,是相同的,如果我像往常一樣定義這些變量?,我可以直接以這種方式添加變量,而不需要定義它們之前,它是可推薦的嗎?

+0

從正在運行的系統中的代碼?你確定模板沒有在這行代碼的下面定義,你在檢查時錯過了嗎? – GeorgeVremescu

+0

nono,他們是許多代碼的第一行,並且他們正在工作沒有問題 – francis

回答

1

是一樣的,如果我定義這些變量像往常一樣?

沒有,定義缺失。 get_object_vars會顯示它們,但get_class_vars不會。

我可以添加變量直接這樣?

是的,這是可能的。他們將公開可見。

沒有之前定義它們?

是的,沒有之前定義它們。他們將公開可見。

它是可推薦的嗎?

那要看情況。通常不會,但是這個規則也有例外。

+0

我不能想到很多情況下,它是值得推薦的。對於任何計劃在實例化後添加到類中的任何內容,似乎都應該使用關聯數組「$ properties」或類似的數據,並具有明確的文檔說明。 –

+0

@ColinMorelli:一個衆所周知的例外是PHP的弱stdClass,它就是這樣工作的。通常當你實現一個具體的類型時,你並不希望這是真的。如果你的系統中有一些元數據處理,你也可以通過動態地將公共屬性分配給對象實例來創建這些元數據。當然,這種情況往往比較脆弱,但只要在處理過程中,它仍然非常穩定。但是,你是對的,我仍然不會推薦這個。 – hakre

+0

公平的,'stdClass'的確可以這樣工作 - 但我想我們都知道PHP核心所做的很多事情都是完全錯誤的。我認爲你的「這條規則有例外情況」評論指的是他們被推薦的情況,而不是實踐中的情況;) –

1

我認爲這段代碼工作的原因是因爲$this->template賦值發生在__construct()上,這在類實例化中幾乎立即發生。所以這可以被看作是一種馬虎般的,但是可變的賦值方式。但這對以後的可讀性或調試沒有幫助。所以答案是肯定的,你可以這樣做。這是「最佳做法」嗎? 100%沒有。

1

雖然不推薦,但PHP和它的非約束(弱類型)使用變量意味着可以即時聲明類變量。

我已經在很多場合意外地完成了它,但之後又回過頭來正確定義它們。默認情況下,它們將具有public訪問方法(與不包括類頭部的訪問方法相同的行爲,即$var = 0private $var = 0)。

同樣,不建議這樣做。我沒有專門進行測試,但我會想象他們會拋出Notice錯誤。另一個問題是,這樣做會使代碼更難以遵循,無論是爲了自己,還是另一個開發人員試圖與你的課程合作。

1

您發佈的代碼無任何問題。

在PHP中,您可以使用未聲明的變量。在其他語言(如Java)中,您不能使用未聲明的變量。這只是一個風格問題,但我個人不喜歡使用它們。

注意,模板VAR,如果未聲明在你的榜樣,有公共visibility

相關問題