Какой самый "элегантный" способ определить глобальный постоянный массив в PHP

Мне было интересно, как вы считаете лучшим и самым чистым способом определения постоянной переменной массива, аналогичной функции define. Я видел много людей, задающих этот вопрос в Google, и до сих пор самым простым решением, которое я придумал, является использование функции PHP serialize внутри оператора define как это

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

то для использования определенной константы вы можете сделать что-то вроде этого:

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

Не уверен, что функция serialize замедлит работу, если в вашем коде указано много . Как вы думаете?

Ответ 1

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

Ответ 2

Сериализация и особенно неэтериализация довольно неудобны. (С другой стороны, не совсем понятно, почему скриптовый язык не может иметь массивы как константы...)

Но это действительно зависит от шаблона использования. Обычно вы хотите, чтобы глобальные значения сохраняли настройки конфигурации. И глобальные переменные и константа подходят для этого (несмотря на то, что "глобальные перемены являются злыми!! 1!" Mem). Но целесообразно бросить все в какой-то объект реестра или массив, по крайней мере:

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() достаточно короткий. Хотя хороший доступ к массиву с помощью MY_ARRAY()["key1"] невозможен до PHP 5.3; но опять же это может быть подделано с помощью MY_ARRAY("key1"), например.