PHP常量包含数组?

这失败了:

define('DEFAULT_ROLES', array('guy', 'development team')); 

显然,常量不能保存数组。 解决这个问题的最好方法是什么?

 define('DEFAULT_ROLES', 'guy|development team'); //... $default = explode('|', DEFAULT_ROLES); 

这似乎是不必要的努力。

注意:虽然这是可以接受的答案,但值得注意的是,在PHP 5.6或更高版本中,您可以使用const数组 – 请参阅下面的Andrea Faulds的答案 。

您也可以序列化您的数组,然后将其放入常量:

 # define constant, serialize array define ("FRUITS", serialize (array ("apple", "cherry", "banana"))); # use it $my_fruits = unserialize (FRUITS); 

从PHP 5.6开始,你可以用const声明一个数组const

 <?php const DEFAULT_ROLES = array('guy', 'development team'); 

简短的语法也是如你所愿:

 <?php const DEFAULT_ROLES = ['guy', 'development team']; 

如果你有PHP 7,你可以终于使用define() ,就像你第一次尝试:

 <?php define('DEFAULT_ROLES', array('guy', 'development team')); 

你可以将它们存储为一个类的静态variables:

 class Constants { public static $array = array('guy', 'development team'); } # Warning: array can be changed lateron, so this is not a real constant value: Constants::$array[] = 'newValue'; 

如果你不喜欢这个数组可以被别人改变的想法,一个getter可能会有所帮助:

 class Constants { private static $array = array('guy', 'development team'); public static function getArray() { return self::$array; } } $constantArray = Constants::getArray(); 

编辑

从PHP5.4开始,甚至可以在不需要中间variables的情况下访问数组值,即以下工作:

 $x = Constants::getArray()['index']; 

如果您使用PHP 5.6或更高版本,请使用Andrea Faulds答案

我正在使用它。 我希望它会帮助别人。

config.php文件

 class app{ private static $options = array( 'app_id' => 'hello', ); public static function config($key){ return self::$options[$key]; } } 

在文件中,我需要常量。

 require('config.php'); print_r(app::config('app_id')); 

这是我用的。 这与soulmerge提供的例子类似,但是这样你可以得到整个数组或者只是一个单一的值。

 class Constants { private static $array = array(0 => 'apple', 1 => 'orange'); public static function getArray($index = false) { return $index !== false ? self::$array[$index] : self::$array; } } 

像这样使用它:

 Constants::getArray(); // Full array // OR Constants::getArray(1); // Value of 1 which is 'orange' 

您可以将其作为JSONstring存储在常量中。 而应用程序的angular度来看,JSON在其他情况下可能是有用的。

 define ("FRUITS", json_encode(array ("apple", "cherry", "banana"))); $fruits = json_decode (FRUITS); var_dump($fruits); 

我知道这是一个老问题,但这里是我的解决scheme:

 <?php class Constant { private $data = []; public function define($constant, $value) { if (!isset($this->data[$constant])) { $this->data[$constant] = $value; } else { trigger_error("Cannot redefine constant $constant", E_USER_WARNING); } } public function __get($constant) { if (isset($this->data[$constant])) { return $this->data[$constant]; } else { trigger_error("Use of undefined constant $constant - assumed '$constant'", E_USER_NOTICE); return $constant; } } public function __set($constant,$value) { $this->define($constant, $value); } } $const = new Constant; 

我定义了它,因为我需要存储常量的对象和数组,所以我安装了runkit到PHP,所以我可以让$ constvariables超全球。

你可以用它作为$const->define("my_constant",array("my","values")); 或者只是$const->my_constant = array("my","values");

要获取值只需调用$const->my_constant;

从PHP 5.6开始,可以像下面那样使用const关键字来定义常量数组

 const DEFAULT_ROLES = ['test', 'development', 'team']; 

不同的元素可以被访问如下:

 echo DEFAULT_ROLES[1]; .... 

从PHP 7开始,可以使用define来定义常量数组,如下所示:

 define('DEFAULT_ROLES', [ 'test', 'development', 'team' ]); 

不同的元素可以像以前一样被访问。

使用爆炸和内爆function,我们可以即兴解决scheme:

 $array = array('lastname', 'email', 'phone'); define('DEFAULT_ROLES', implode (',' , $array)); echo explode(',' ,DEFAULT_ROLES ) [1]; 

这将回应email

如果你想让它更优化,你可以定义2个函数来为你做这样的重复的事情:

 //function to define constant function custom_define ($const , $array) { define($const, implode (',' , $array)); } //function to access constant function return_by_index ($index,$const = DEFAULT_ROLES) { $explodedResult = explode(',' ,$const ) [$index]; if (isset ($explodedResult)) return explode(',' ,$const ) [$index] ; } 

希望有所帮助。 快乐的编码。

做某种编码/编码或编码/解码技巧看起来很难看,并且要求你记住当你试图使用这个常量时你做了什么。 我认为类私有静态variables与accessor是一个体面的解决scheme,但我会做你更好。 只要有一个公共的静态getter方法,返回常量数组的定义。 这需要最less的额外代码,并且数组定义不能被意外修改。

 class UserRoles { public static function getDefaultRoles() { return array('guy', 'development team'); } } initMyRoles( UserRoles::getDefaultRoles() ); 

如果你想真的让它看起来像一个定义的常量,你可以给它一个全部大写的名字,但是记住在名字后面加上'()'括号会令人困惑。

 class UserRoles { public static function DEFAULT_ROLES() { return array('guy', 'development team'); } } //but, then the extra () looks weird... initMyRoles( UserRoles::DEFAULT_ROLES() ); 

我想你可以使全局方法更接近你所要求的define()function,但是你应该确定常量名的范围,避免使用全局variables。

你可以像这样定义

 define('GENERIC_DOMAIN',json_encode(array( 'gmail.com','gmail.co.in','yahoo.com' ))); $domains = json_decode(GENERIC_DOMAIN); var_dump($domains); 

是的,您可以将数组定义为常量。 从PHP 5.6开始 ,可以将一个常量定义为一个标量expression式,也可以定义一个数组常量 。 可以将常量定义为资源,但应该避免,因为这可能会导致意外的结果。

 <?php // Works as of PHP 5.3.0 const CONSTANT = 'Hello World'; echo CONSTANT; // Works as of PHP 5.6.0 const ANOTHER_CONST = CONSTANT.'; Goodbye World'; echo ANOTHER_CONST; const ANIMALS = array('dog', 'cat', 'bird'); echo ANIMALS[1]; // outputs "cat" // Works as of PHP 7 define('ANIMALS', array( 'dog', 'cat', 'bird' )); echo ANIMALS[1]; // outputs "cat" ?> 

随着这个链接的参考

有一个快乐的编码。

常量只能包含标量值,我build议你存储数组的序列化(或JSON编码表示)。

我同意eyze,常量往往是应用程序整个生命周期所需的单值。 您可能会考虑使用configuration文件而不是常量来处理这类事情。

如果你真的需要常量数组,你可以使用命名约定来模仿一些数组:例如DB_Name,DB_USER,DB_HOST等

PHP 7+

从PHP 7开始,可以使用define()函数来定义一个常量数组:

 define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // outputs "cat" 

甚至可以与关联数组一起工作..例如在一个类中。

 class Test { const CAN = [ "can bark", "can meow", "can fly" ], ANIMALS = [ self::CAN[0] => "dog", self::CAN[1] => "cat", self::CAN[2] => "bird" ]; static function noParameter() { return self::ANIMALS[self::CAN[0]]; } static function withParameter($which, $animal) { return "who {$which}? a {$animal}."; } } echo Test::noParameter() . "s " . Test::CAN[0] . ".<br>"; echo Test::withParameter( array_keys(Test::ANIMALS)[2], Test::ANIMALS["can fly"] ); // dogs can bark. // who can fly? a bird. 
 define('MY_ARRAY_CONSTANT_DELIMETER', '|'); define('MY_ARRAY',implode(MY_ARRAY_CONSTANT_DELIMETER,array(1,2,3,4))); //retrieving the array $my_array = explode(MY_ARRAY_CONSTANT_DELIMETER, MY_ARRAY); 

你也可以将数组分解为一系列的常量。 (一个相当古老的学校解决scheme)毕竟,数组是恒定的 ,所以你需要它的唯一原因是全局的,快速的,查找某些键。

因此:

 define('DEFAULT_ROLES', array('guy', 'development team')); 

会变成:

 define('DEFAULT_ROLES_0', 'guy'); define('DEFAULT_ROLES_1', 'development team'); 

是的,有名字空间污染(和许多前缀,以防止它)考虑到。

这是正确的,你不能使用数组常量,只有定标器和null。 使用常量数组的想法似乎有点倒退。

我build议做的是定义你自己的常量类,并使用它来获得常量。