Мне было интересно, как вы считаете лучшим и самым чистым способом определения постоянной переменной массива, аналогичной тому, как работает функция определения . Я видел много людей, задающих этот вопрос в Google, и до сих пор самым простым решением, которое я придумал, является использование функции сериализации PHP внутри инструкции define , например
define ("MY_ARRAY", serialize (array ("key1" => $value1,"key2" => $value2, ..)));
то для использования определенной константы вы можете сделать что-то вроде этого:
$MY_ARRAY = unserialize (MY_ARRAY) print_r ($MY_ARRAY);
Не уверен, что функция сериализации приведет к замедлению, если в коде есть много определений . Как вы думаете?
$GLOBALS['MY_ARRAY'] = array();
Сериализация и особенно неэтериализация довольно неудобны. (С другой стороны, не совсем понятно, почему скриптовый язык не может иметь массивы как константы …)
Но это действительно зависит от шаблона использования. Обычно вы хотите, чтобы глобальные значения сохраняли настройки конфигурации. И глобальные переменные и константа подходят для этого (несмотря на то, что «глобальные перемены являются злыми !! 1!» Mem). Но желательно бросить все в какой-то объект реестра или массив по крайней мере:
class config { var $MY_ARRAY = array("key1"=>...); var $data_dir = "/tmp/"; }
Это дает простейший синтаксис доступа с config::$MY_ARRAY
. Это не совсем постоянный, но вы можете легко подделать его. Просто используйте ArrayObject или ArrayAccess и реализуйте его таким образом, чтобы атрибуты были доступны только для чтения. (Сделать offsetSet выдает ошибку.)
Если вам нужен обходной метод глобального массива, тогда другая альтернатива (я украл эту идею на странице руководства по определению ) – это использовать функцию вместо константы:
function MY_ARRAY() { return array("key1" => $value1,); }
Доступ снова не совсем постоянный, но MY_ARRAY()
достаточно короткий. Хотя хороший доступ к массиву с MY_ARRAY()["key1"]
невозможен до PHP 5.3; но опять же это может быть MY_ARRAY("key1")
с MY_ARRAY("key1")
например.