2011-04-19 28 views
4

我想初始化一個類中的一些值,並將它們保存在常量中,並在我的代碼的不同部分訪問它們。我可以在一個類中設置一個常量,然後在PHP之外訪問它嗎?

<?php 

class Config { 

    public static function initialize() { 
    define('TEST',"This is a Constant"); 
    } 

} 

$config = Config::initialize(); 
// do something with the constants 

我可以在外面訪問嗎?

+1

你是說,一個靜態屬性? – Andre 2011-04-19 01:42:24

+0

是的,我想用不同的設置進行初始化並在外面訪問它們,使用這個靜態功能 – Ibu 2011-04-19 01:43:53

+0

您的代碼將定義一個全局常量。 Class :: constants是一個分析時語法結構,不能在以後定義。 – mario 2011-04-19 01:49:39

回答

7

類常量使用const關鍵字。你不使用define函數來定義它們。就像這樣:

class Config { 
     const TEST = "This is a constant"; 
} 

// then use it: 
var_dump(Config::TEST); 

在PHP中,你不能動態地設定一個恆定的值,但你可以得到一個公共靜態變量類似的行爲。即。

class Config2 { 
    public static $test = null; 
    public static function initialize() 
    { 
     self::$test = "This is not a constant"; 
    } 
} 

// Then use like 
Config2::initialize(); 
var_dump(Config2::$test); 

缺點是,沒有任何來自外部類設置數值停止其他代碼。如果你需要防範這一點,你應該使用getter函數方法。例如。

class Config3 { 
    private static $_test = null; 
    public static function initialize() 
    { 
     self::$_test = "This is not a constant, but can't be changed outside this class"; 
    } 

    public static function getTest() 
    { 
     return self::$_test; 
    } 
} 

// Then use like 
Config3::initialize(); 
var_dump(Config3::getTest()); 
+0

CONSTANT的內容是動態的,所以我不能像這樣定義 – Ibu 2011-04-19 01:53:14

+0

您不能動態設置常量(AFAIK),我已經添加了一些備選選項。 – 2011-04-19 02:00:34

0

是 - 你不能從你的原代碼訪問它Config::TEST

+1

這不是訪問* class *常量的方式嗎?片段中的一個不是類常量。 – 2011-04-19 01:44:42

+0

是的,你是對的 - 定義的值不能動態設置,所以把它們放入函數是沒有意義的。 – 2011-04-19 01:46:35

1

。但是,以下將作爲一個常量類變量。

class Config { 
    const TEST = "This is a Class Constant"; 
... 
} 

從任何地方訪問的包括Config類的聲明,如:

echo Config::TEST; 
5
class Config { 
    const TEST = "This is a Constant"; 

    static public $test = "This is a static property test." 
    static protected $test2; 

    public static function initialize() { 
     self::$test2 = 'initialized'; 
     return self::$test2; 
    } 

    public static function getTest2() 
    { 
     return self::$test2; 
    } 
} 

echo Config::TEST; // outputs This is a Constant 
echo Config::$test; // outputs This is a static property test. 
echo Config::initialize(); // outputs initialized; 
echo Config::getTest2(); // outputs initialized; 

如果您需要動態設置的值,那麼你不想使用恆定的,你想用一個靜態的屬性。如果您只希望Config類能夠直接操作此屬性的值,請使用privateprotected關鍵字。如果這不是問題,那麼你可以使用public屬性。

另一個,也許取決於你想實現什麼樣的方法最堅固的是使用常量來訪問類的靜態或實例特定屬性:

class Config 
{ 
    const TEST = 0; 
    const TEST2 = 1; 

    protected static $conf = array(); 

    public static function initialize($testVal, $test2Val) 
    { 
    $conf[self::TEST] = $testVal; 
    $conf[self::TEST2] = $test2Val; 
    } 

    public static function get($key) 
    { 
    if(isset(self::$conf[$key]) 
    { 
     return self::$conf[$key]; 
    } 
    } 
} 

Config::initialize('Test', 'Test 2'); 
echo Config::get(Config::TEST); 
echo Config::get(Config::TEST2); 
0

也許你就需要在這種情況下是一個private變量,的getter方法或類常量。

相關問題