在PHP中定义全局常量数组的最“优雅”方法是什么

时间:2011-01-09 02:54:03

标签: php arrays constants global

我想知道你认为什么是定义一个常量数组变量的最佳和最干净的方法,类似于 define 函数的工作方式。我见过很多人在Google上提出这个问题,到目前为止我提出的最简单的解决方案是在 define 语句中使用PHP 序列化功能,像这样

define ("MY_ARRAY", serialize (array ("key1" => $value1,"key2" => $value2, ..)));

然后使用定义的常量,你可以这样做:

$MY_ARRAY = unserialize (MY_ARRAY)
print_r ($MY_ARRAY);

如果您的代码中有很多定义,则不确定序列化功能是否会降低您的速度。你觉得怎么样?

2 个答案:

答案 0 :(得分:6)

序列化,特别是反序列化非常尴尬。 (另一方面,为什么脚本语言不能将数组作为常量也不太清楚......)

但它确实取决于使用模式。通常,您需要用于存储配置设置的全局定义。全局变量和常量是适当的用途(尽管“全局变量是邪恶的!1!”meme)。但建议至少将所有内容都放入某种注册表对象或数组中:

class config {
     var $MY_ARRAY = array("key1"=>...);
     var $data_dir = "/tmp/";
} 

这为config::$MY_ARRAY提供了最简单的访问语法。这不是一个常数,但你很容易伪造它。只需使用ArrayObject或ArrayAccess,并以一种使属性为只读的方式实现它。 (让offsetSet抛出错误。)

如果你想要一个全局数组常量解决方法,那么另一个替代方法(我从define manual page中窃取了这个想法)是使用函数来代替常量:

function MY_ARRAY() {
     return array("key1" => $value1,);
}

访问权限再次不是很稳定,但MY_ARRAY()足够短。虽然PHP 5.3之前不可能使用MY_ARRAY()["key1"]进行良好的数组访问;但同样可以伪造MY_ARRAY("key1")

答案 1 :(得分:6)

$GLOBALS['MY_ARRAY'] = array();