2011-03-22 58 views
6

我有以下模式在構造函數之後設置類常量?

class MyClass 
{ 
    const x = 'abc'; 
    const y = '123'; 

    function _contruct() {} 
} 

有什麼辦法,我有常量類體保持未設置,並且可以動態地設置構造函數被調用後一類? E.g是這樣的:

class MyClass 
{ 
    const x; 
    const y; 

    function _contruct() 
    { 
     $this->setStuff(); 
    } 

    function setStuff() 
    { 
    $this->x = Config::getX(); 
    $this->y = Config::getY(); 
    } 
} 
+1

只是好奇,你想在這裏完成什麼? – 2011-03-22 09:54:20

+0

@標記現在的類需要一些配置值在類體中進行硬編碼,我試圖改變它,以便稍後在類中從配置類獲取它 – 2011-03-22 09:56:12

+1

似乎毫無意義使它們成爲常量。 – 2011-03-22 09:58:45

回答

6

正如其名稱所暗示的,該值 不能的 腳本執行過程中改變(除了所謂的魔術 常量,它們其實不是 常量)(http://php.net/manual/en/language.constants.php

所以,沒有。你可以讓它們變成私人的變量。

4

號類常數(並與const關鍵字定義的全局或命名空間常量)必須是文字值,並且必須在運行時間之前進行設置。這就是他們與在運行時設置的舊式define()常量不同的地方。在腳本執行過程中無法更改或設置const常量。

該值必須是一個常數 表達,而不是(例如) 變量,屬性,一個 數學運算的結果,或函數 呼叫。

從PHP手冊:Class Constants

所以這是可能的:

define('MY_CONST', someFunctionThatReturnsAValue()); 

但是,這不是:

const MY_CONST = someFunctionThatReturnsAValue(); 

// or 

class MyClass { 
    const MY_CONST = = someFunctionThatReturnsAValue(); 
} 

// or 

namespace MyNamespace; 
const MY_CONST = someFunctionThatReturnsAValue(); 

並通過你的榜樣使用$this人們可能會認爲你嘗試設置實例級別的常量,但類常量a總是靜態地定義在課堂上。

+0

舊的skool定義語句的問題在於它們的範圍不受限制。如果他們從C++中獲得一個提示並允許常量在運行時分配這些功能,那將會很有用。這樣,如果我們想要保存一些數據以供後續驗證(例如用戶ID),我們仍然可以在運行時聲明它(例如,從$ _SESSION變量中),將其限制爲一個類並使其不可更改。但是,很好的解釋。多謝你們! – Atomox 2011-11-29 21:40:21

1

常量是「常量」。你不能改變它。

您可以爲此使用變量。

1

不可能。如果你可以在setStuff()中設置x和y,你也可以用任何其他方法(重新)設置它們。每定義一個常數不能改變。因此,你的x和y將是變量,而不是常量。

3

不,常量是常量,因爲它們應該是常量。首先用空值聲明它們並有效地改變這些值意味着它們是可變的。由於您的目標似乎是設置它們一次,但從未考慮過,請考慮構造函數注入,例如

class MyClass 
{ 
    private $x; 
    private $y; 
    public function __construct($x, $y) 
    { 
     $this->x = $x; 
     $this->y = $y; 
    } 
} 

只要你的類犯規暴露任何方法來修改$x$y和你沒有內部chaning他們,他們是有效的常數。你不能用非公共變量做的唯一的事情是MyClass::X,但我認爲你不應該在它們各自的類之外使用類常量,因爲它引入了消費者和類之間的耦合。

那樣簡單。

相關問題