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议做的是定义你自己的常量类,并使用它来获得常量。