2017-06-14 82 views
1

我需要靜態類(對象)來存儲全局變量值。我是PHP新手,但我有其他語言的經驗,如Java中的OOP概念。在Java中,我可以使靜態變量,並可以調用任何我想要的。但如何在PHP中做同樣的事情?如何在PHP中創建靜態類

我使用CodeIgniter框架之前,我嘗試這個我嘗試使用會話來存儲,但我想用另一種方式像上面。誰能幫我?

我可以這樣嗎?

static class myClass{ 
public static myVar = ""; 
} 
+0

爲什麼你寫了靜態類myClass,我從來沒有見過它任何面向對象的語言?如果你想要一個靜態屬性,它和java一樣。 –

+0

可能的重複:https://stackoverflow.com/questions/468642/is-it-possible-to-create-static-classes-in-php-like-in-c – CD001

回答

1

因爲你提到了框架Codeigniter和會話的使用,我假設你需要在多個控制器和視圖中使用它。 所以我還有另一種方式,它與類的屬性有點不同,但比會話更類似(除了更改後的值不會影響另一頁)。

So Use Constant

定義它

應用程序>配置> constant.php

頁。在該頁面中定義了許多常量,使用完全相同的語法可以定義值,並且可以非常方便地將它用於任何位置。

就像如果你定義在constant.php SITE_NAME常數 defined('SITE_NAME') OR define('SITE_NAME', "My Example Site");

之後,你可以在你笨的任何控制器,視圖或模型的任何地方使用它,你需要做的僅僅是呼應它

<?php echo SITE_NAME; //only SITE_NAME not $SITE_NAME ?> 

我希望這是你想要的,如果不是對我的誤解抱歉。

0

您可以在PHP中使用類似靜態的類。但是您沒有PHP中的應用程序循環。這意味着你不會在整個應用程序中獲得真正的靜態(或單例)。

+0

但任何其他方式做類似於笨? – Patrick

+0

我沒有使用CodeIgniter的經驗,但我會建議使用單身模式。我一直比較喜歡單身人士,即使是在Java中。 –

0

如果您不能實例化一個類,那麼它應該是abstract並將其方法定義爲static。但是,有人可以將這個類子類化並使其非抽象。如果你不希望這是一種可能性,那麼課程應該是abstract final

如果你這樣做,你可以用ClassName::methodName()語法直接調用相關類的方法。請記住,像這樣寫的類不能使用$this,因爲它只對一個對象實例有效。如果您需要該類來維護狀態,那麼您將必須定義一個靜態變量,並使用它的語法爲self::static::

abstract final class SomeClass 
{ 
    private static $var = ""; 

    public static function setVar($newVal) 
    { 
     self::$var = (string) $newVal; 
    } 

    public static function getVar() 
    { 
     return self::$var; 
    } 
} 

謹慎做這雖然,使用抽象類的字/方法可以很容易導致緊密耦合的代碼是壞的原因很多。例如,如果您編寫的一個類通過除了從抽象類繼承以外的任何其他方式直接調用抽象類的方法,那麼將不可能單獨測試該類。它總是會要求你的抽象類也成爲測試套件的一部分,這意味着要確定測試失敗是由測試類中的錯誤還是由它所依賴的抽象類造成的更難。更重要的是,如果您所依賴的抽象類用作數據源的訪問者,那麼您在測試期間也將無法模擬該類。 Mocking是驗證類的正確性的一種非常強大的方法,而不必依賴於運行類的環境。例如,可以使用兼容對象來模擬數據庫訪問類,該對象總是從數組中返回相同的數據而不是擊中實際的數據庫。這意味着你可以保證,當你運行一個測試時,它將運行在一個你可以完全控制的狀態下的數據。如果您通過抽象類的方法訪問數據庫,那麼您無法替換測試的數據庫,並且突然之間可能會得到一個測試套件,這可能會在您運行測試時取決於數據庫的狀態而成功或失敗。更糟糕的是,如果您的測試涉及寫入數據庫,那麼在運行測試時可能會損壞數據源。