2012-07-25 52 views
4

我一直在想,一段時間以來,靜態變量如何處理內存使用,應該甚至真的考慮?PHP靜態變量內存使用情況

我知道靜態變量只會佔用一個內存區域,並不重要,這個類本身有多少個實例。所以從這個意義上說,明智地使用靜態變量來明智地消耗內存,對吧?但是我從未偶然發現任何人在談論靜態變量的內存使用情況(只有你可以用不同的實例共享數據)。

例如:

class Something() { 
    static $DB = null; 
    __construct ($DB) { 
     $this->DB = $DB; 
    } 
} 

如果我想創建這個類的10個實例,那麼它會產生內存佔用少,比非靜態$ DB-變量,對不對?

如果是這樣,效果是如此之小,它並不重要?

+1

靜態變量是「類的屬性」,而不是實例。 – Esailija 2012-07-25 09:41:18

回答

2

而且應該甚至被認爲是真的嗎?

不,您不應該爲此擔心static s。

您必須擔心使用static的原因是您無法再單元測試您的代碼,並且您已將類和代碼緊密耦合到Something::DB(即Something類),並且您正在使用全局狀態。

也由我有關如何處理這些「全局」實例簽出以前的答案:Which is the best practice to access config inside a function?

+0

好的。所以它非常接近我的預期。由於我單獨編寫代碼而不是單元測試,因此我很難看到一些不好的編碼習慣。感謝您的澄清,我現在明白了。 – Hachi 2012-07-25 09:47:00

+2

@PeeHaa - 你可以用stgatic變量進行單元測試。只要讓它們受到保護,然後創建一個繼承它們的類。在那個你可以測試的類中可以添加重置這些靜態變量的功能。 – 2012-07-25 09:49:02

+0

你將如何在他們被用於另一課時嘲笑他們?你可以說依賴注入a.k.a好萊塢原則? – PeeHaa 2012-07-25 09:50:08

1

是的,一個類的靜態屬性將被存儲在一個單獨的內存實例。

但是,在作出靜態變量決定時,這不是一個問題。它們用於課堂級別的信息,例如保持課程實例的計數。

經歷何時使用靜態變量以下職位#1:

+0

哇。這是你在那裏連接的一個可怕的答案。 – PeeHaa 2012-07-25 09:46:22

+0

我沒有把它連接到任何答案。我已將它與一個有許多答案的問題聯繫起來。通過投票排序它們,並描述何時向我們提供靜態變量。我相信在這個主題上還會有其他SO線程。 – 2012-07-25 10:15:22

+1

謝謝你的鏈接Ozair!我確實搜索得很公平,但從未真正找到過這樣的好線索。 – Hachi 2012-07-25 10:23:40

2

在你的情況,請重新考慮你的軟件設計。在使用靜態變量的情況下 - 你正在嘗試(如果它不是,那麼爲什麼你需要靜態?),以便從一個地方訪問某些東西,而不用重新創建它,例如使用Singleton模式來創建數據庫對象的單個實例。但是如果我們談論的是內存使用情況,那麼是的,如果你要創建更多的對象,所以你需要複製變量 - 它需要更多的內存,但是對於靜態內存的使用情況並沒有真正的變化。

+0

我的問題是,我有一些全局設置/變量(例如數據庫)。這個變量可以是使用變量的類中的默認值,但到目前爲止,我只想出了使用參數傳遞DB對象到所有使用DB對象的不同類,這看起來像是浪費。 例如,如果我有一個認證,國際化和調試類,並希望他們和主索引頁使用數據庫。我有什麼其他的可能性,而不是將DB變量傳遞給構造函數? – Hachi 2012-07-25 10:01:09

+0

正如我所說的,你可以使用Singleton模式。通過使用這種設計實現數據庫,可以通過調用例如DB :: query(..)或DB :: getAll()來使用它。請使用google閱讀關於Singleton模式的內容。 – Anton 2012-07-26 07:27:10

0
  1. 您應該使用

    自:: $ DB

訪問靜態變量(如$this在一類廣泛的範圍內沒有任何意義)

  1. 應該使用static來表示該類的所有對象共享的東西。

  2. 您不應該使用構造函數中的參數來創建靜態變量。這樣做時,靜態變量會在您創建該類型的新對象時被覆蓋