2012-05-12 15 views
1

我正在PHP5中創建一個Web應用程序。到目前爲止,我有兩個「全局」變量:$ input和$ sql。 $ input是來自$ _GET,$ _POST和$ _COOKIE的驗證和消毒輸入。 $ sql是我的mysql(i)類的一個實例。避免將變量始終傳遞到類

這兩個是幾乎所有其他班級都需要的。這可以通過將它們作爲參數傳遞給每個類的__construct函數來實現。但是,這似乎...笨拙。隨着更多的類特定參數和潛在的未來全球變量,它會導致笨拙的函數調用。

容易和,據我所知,noobie替代將使用全球關鍵字。我不想這樣做。儘管在我的場景(小應用程序)中,它們並不重要,但我卻遇到了全局變量的缺點。但在再次使用它們之前明確標記它們也是笨拙的。

我想一個更優雅的方式:我有一個webapp類,從中擴展所有其他類。這個webapp類擁有我需要在多個其他類中使用的常用功能,但不適用於單獨的類。 如果我將$ input和$ sql作爲靜態變量存儲在此webapp主類中,則它們可以在所有子類中訪問。 但我明白,靜態變量與全局變量一樣多,如果不是更多的話。

這是真的嗎? 我想我是其中的一個人,他們過分地嘲笑了一切,但我喜歡優雅的代碼,這對我的(業餘)眼睛來說看起來很優雅。

+0

不知道是否可以回答你的「問題」,而是「是」我們通過*依賴*(它實際上是這裏最重要的術語)在構造函數(構造函數注入)或方法(方法注入) – zerkms

+0

@zerkms好了。如果這是最佳做法,我會習慣它:o) – Ryan

回答

2

到目前爲止,我有兩個 「全局」 變量

呸!全局不好。 :-)

$輸入來自_GET,$ _ POST和$ _COOKIE

的驗證和消毒輸入你爲什麼要作出這樣的全球性的。簡單地消毒/正常化/什麼時候你真的要使用它。

$ sql是我的mysql(i)類的一個實例。

再一次:沒有必要做出這樣的全球化。使用dependency injection

容易和,據我所知,noobie替代將使用全局關鍵字。我不想這樣做。

你是對的:你不想這樣做。

我想一個更優雅的方式:我有一個webapp類,從中擴展所有其他類。

這也聽起來不正確。一個類有一個特定的功能(/責任)。

但我明白,靜態變量在

靜態的東西,多皺起了眉頭只是用不同的名稱全局。

如果你想讓你的生活更輕鬆,你可以實施一個dependency injection container

+0

這就是答案。 – Mahn

-1

http://php.net/manual/en/language.oop5.patterns.php

以下鏈接介紹了單件模式這是面向對象的方式,也提供了一個類的單個全局實例。我敢肯定,這是非常優雅的,否則你會爲了繼承而繼承子類,並且不要求它們作爲參數傳遞。 這是我會做的:)

+1

@RepWhoringPeeHaa:即使我同意單身人士是「邪惡的」 - 它比**更好**。至少通過我們可以**控制他們的事實 – zerkms

+0

@zerkms好的,你有一個關於哪個更糟糕的小點。然而,恕我直言,這是在你的頭或槍(或其他致命的)採取子彈之間的差異。 :-) – PeeHaa

+0

@RepWhoringPeeHaa:單身代碼足夠可維護。這是很難測試,但很容易調試。所以我不能同意你的隱喻。 – zerkms

-1

就我個人而言,我會僱用在這個例子中的單身人士。單身人士可以皺眉,但在正確的情況下,他們是完美的罰款。

我會創建你的「WebApp」類作爲單例,這意味着你需要這些變量的地方你可以簡單地訪問「WebApp」。

如果你從來沒有使用之前singletone,這裏有一個例子:

class WebApp 
{ 
    private static $instance = null; 
    private $post_data = array(); 

    private function WebApp(){} 

    public static function instance(){ 
     if(!isset(WebApp::$instance)) 
      WebApp::$instance = new WebApp(); 
     return WebApp::$instance; 
    } 
} 

print_r(WebApp::instance()->post_data); 
+0

看到我的[其他評論](http://stackoverflow.com/questions/10564443/avoid-passing-variables-to-classes-all-the-time/10564464#comment- 13675390)關於爲什麼單身人士不好。 – PeeHaa

+0

我完全不同意。任何只是說「模式X不好」的人都不知道他們在說什麼。雖然我會同意人們可以傾向於使用單身人士,因此爲什麼它會得到這個不好的聲譽,每個模式都有一個時間和地點,在這個用戶例子中就是這個地方。 –

+0

@AdamThornton:雖然我普遍同意absolutions是一件壞事,但在這種情況下,我完全同意@RepWhoringPeeHaa ...給我看一個單例合適的例子,並且告訴你,你的架構是有缺陷的。它的聲譽很差,因爲單身人士在'OOP'中沒有地位。現在,如果你正在做面向類的編程,很好。但在OOP中,他們絕對沒有地方...... – ircmaxell