2010-09-27 36 views
53

我們可以這樣定義是否有可能宣佈一個數組恆定

define("aconstant','avalue'); 

恆定我們不能以這種方式定義數組像下面?

define("months",array("January", "February", ---); 
+3

您可以稍微將數組轉換爲字符串並將其存儲爲常量。當你需要它時,你只需要重新轉換它。看看(un)序列化的例子: http://stackoverflow.com/questions/1290318/php-constants-containing-arrays – Armfoot 2013-06-27 07:59:11

+1

是的,從PHP 5.6上你可以做到這一點。請參閱http://stackoverflow.com/a/26470982/1163786 – 2015-01-03 20:53:42

回答

58

UPDATE:這是有可能在PHP 7(reference

// Works as of PHP 7 
define('ANIMALS', array(
    'dog', 
    'cat', 
    'bird' 
)); 
echo ANIMALS[1]; // outputs "cat" 

原來的答案

從php.net ...

常數的值;只有標量和空值是 允許。標量值是整數,浮點數,字符串或布爾值。 可以定義資源常量,但不推薦使用 ,並可能導致不可預知的行爲。

$months = array("January,"February",...)就好了。

+2

爲防萬一別人不注意其他答案,可以在PHP 5.6中創建一個「const」數組或者新。 – orrd 2015-09-05 06:52:20

+1

不是'$ months = array(「January,」February「,...)'缺少一個引號嗎? – 2015-12-04 22:26:09

+2

只需要清楚,PHP 7的介紹也包含關聯數組。'define('MY_ANIMALS',array ('dog'=>'Ottie','cat'=>'Garfield','bird'=>'Tweetie')); echo MY_ANIMALS ['cat']; //輸出'Garfield'' – owenmck 2015-12-10 12:22:16

11

不,你不能。見PHP: Syntax - Manual

只有標量數據布爾,整數,浮點和)可以被包含在常量。 可以將常量定義爲資源,但應避免使用它,因爲它可能會導致意外的結果。

+1

+1我想知道爲什麼PHP允許首先定義常量資源? – BoltClock 2010-09-27 11:56:55

+0

@ BoltClock的一個獨角獸:我不完全清楚,從來沒有遇到過這樣的解釋。但考慮到PHP的發展歷史,它不會因爲一些'歷史原因'而感到驚訝...... :) – 2010-09-27 12:06:11

29

你可以把裏面的常數陣列,一個黑客:

define('MONTHS', serialize(array('January', 'February' ...))); 

但你必須unserialize()需要時恆定值,我想這是不是真的有用。

作爲替代方案,定義多個常數:

define('MONTH_1', 'January'); 
define('MONTH_2', 'February'); 
... 

並使用constant()功能來查找值:

echo constant('MONTH_'.$month); 
+3

+1,但我想知道,json_encode和json_decode怎麼樣?哪一個更適合內存和性能? – jeff 2014-02-11 16:56:23

+4

@CengizFrostclaw:'serialize' would b在大多數情況下更好。即使它最終變慢了一點(我猜想它與事實相反),但它本身支持PHP概念,如引用和類型化對象,這些概念在JSON中的往返行程中無法生存。 – cHao 2014-03-11 12:49:28

+0

@cHao,是的序列化速度更快,但它也可能執行代碼也很危險。即使這裏不適用,我認爲安全意識的開發人員應該習慣使用最危險的方法。在這種情況下,性能差異可以忽略不計,我認爲JSON方法在這裏更好。 – 2014-12-08 13:23:23

6

如果你必須有一個恆定的,如何使用AA分隔字符串和爆炸成一個數組?

define("MONTHS", "January;February;March"); 
$months = explode(";",MONTHS); 
+1

不錯的選擇,我會很好奇看到性能與序列化。 – siliconrockstar 2014-04-10 15:01:21

+2

我想這將需要一個大陣才能真正有顯着的區別。 – 2014-04-16 12:58:30

75

可以使用常量以來PHP 5.6(通過nikic)的目的所在。

const months = ["January", "February"]; 
var_dump("January" === months[0]); 
+0

這真的應該有更多upvotes(不只是我的^^)。 – Levit 2014-12-03 10:38:39

+1

@Levit:我會upvote一次,我實際上可以使用5.6 :) – cHao 2014-12-11 04:16:59

+0

@cHao:好的! ^^儘管如此,我還是喜歡它在5.6中是可能的,事實上這是5.6以後的最乾淨/完美的答案。即使5.3仍然是主要使用的,而5.6運行在所有php網站的不到1%的情況下,這僅僅是爲了指出該功能的存在(並且從現在開始多年,當這些版本更多時標準,這不會坐在1 upvote,而使用變量的建議有超過200 upvotes +接受)。咆哮,我真的很喜歡你的評論! ^^ – Levit 2014-12-11 07:27:09

9

您可以使用JSON格式將數組保存到字符串中,然後將此字符串分配給常量。

$months = array("January","February","March"); 
define('MONTHS', json_encode($months)); 

當你想使用它:

$months = json_decode(MONTHS); 
+0

PHP 5.x的最佳答案! – 2017-07-07 04:15:24

6

隨着PHP 5.6的,有可能to declare constant arrays。鏈接的文檔使用示例const ARR = ['a', 'b'];。你也可以做const ARR = array('a', 'b');。然而,在5.6中有一個奇怪的怪癖:你可以使用const來聲明常量數組,但不是define()。這個has been corrected在PHP 7.0中。

相關問題