Какой самый «элегантный» способ определить глобальный константный массив в PHP - PullRequest
10 голосов
/ 09 января 2011

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

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

затем, чтобы использовать определенную константу, вы можете сделать что-то вроде этого:

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

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

Ответы [ 2 ]

6 голосов
/ 09 января 2011
$GLOBALS['MY_ARRAY'] = array();
6 голосов
/ 09 января 2011

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

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

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

Это дает простейший синтаксис доступа с config::$MY_ARRAY.Это не совсем константа, но вы можете легко подделать это.Просто используйте ArrayObject или ArrayAccess и реализуйте его так, чтобы сделать атрибуты доступными только для чтения.(Заставьте offsetSet выдать ошибку.)

Если вы хотите обойти постоянное значение глобального массива, тогда есть другая альтернатива (я украл эту идею со страницы руководства define ) означает использование функции вместо константы:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...