PHP - константы / глобальные переменные / конфигурация - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть скрипт (маленькая и простая CMS-подобная система), над которым я всегда работаю, и использую его для клиентских сайтов.Поскольку у клиентов разные требования, я реализовал модульную систему, которая позволяет мне изменять или добавлять функциональные возможности в CMS без необходимости изменения сценария CMS.

Как мне реализовать систему конфигурации, которая позволяет мнеизменить настройки по умолчанию основной CMS из модулей?

Например, CMS по умолчанию имеет два меню: $menu = array('menu-1', 'menu-2'); Как я могу переопределить этот параметр из модулей?

Одно решениеЯ подумал о том, чтобы использовать константы и сериализовать / десериализовать:

defined("BLA") or define("BLA", serialize(array(
 'boo' => 'stuff',
 'foo' => array('1', '2', '3'),
 'moo' => true,
 ...
)));

Так что я мог бы легко переопределить этот параметр в функции инициализации модуля, которая запускается до определения константы в CMS.

Затем я использую эти константы повсюду в своих скриптах, например:

$bla = unserialize(BLA);
...
foreach(unserialize(BLA) as $key => $value)...

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

Так есть ли лучшие решения для того, что я ищу?

Ответы [ 4 ]

5 голосов
/ 03 февраля 2011

Я бы рекомендовал использовать класс со статическими переменными. Более или менее тот же результат, но не требуется десериализация, и вы можете использовать переменную, а не временную.

// My Constants
class MCo { 
    public static $BLA = array(
        'boo' => 'stuff',
        'foo' => array('1', '2', '3'),
        'moo' => true,
        // ...
    );
}

echo MCo::$BLA['boo'];

foreach (MCo::$BLA as $key => $value) {
    // ...
}

РЕДАКТИРОВАТЬ: ircmaxell имеет точку, рассмотрим это тогда

// My Private Constants
class MPCo { 
    private static $_BLA = array(
        'boo' => 'stuff',
        'foo' => array('1', '2', '3'),
        'moo' => true,
        // ...
    );
    public static BLA() {
        return self::$_BLA;
    }
}

foreach (MPCo::BLA() as $key => $value) {
    // ...
}
1 голос
/ 03 февраля 2011

Это действительно не нужно, просто используйте переменную вместо константы, это будет проще, понятнее, и я думаю, что производительность будет лучше.

1 голос
/ 03 февраля 2011

Первый вопрос, который я задам, - зачем вам массив в константе. Вероятно, есть другое решение вашей проблемы, которое так же хорошо, но не требует массивов.

Одна из лучших альтернатив - создать объект конфигурации и передать его. Таким образом, он все еще тестируем, поскольку вводит зависимости и не влияет на производительность при работе с сериализацией.

$config = new StdClass();
$config->boo = 'stuff';

doSomething($config);

Константы не намного лучше, чем глобальные переменные. На самом деле, в некоторых отношениях они хуже, так как с ними очень трудно тестировать, так как после определения константы вы не сможете ее изменить. Таким образом, в поисках хорошего тестируемого кода константы не являются хорошими. Если вы зависите от констант, отличных от работы с магическими числами или путями файловой системы, вы можете переосмыслить свой подход (даже константы с магическими числами лучше обрабатывать с помощью класса конфигурации) ...

1 голос
/ 03 февраля 2011

Если будет много статических данных, которые вы планируете хранить в массиве, почему бы не сохранить их в файле конфигурации?Кроме того, вы можете загрузить его из БД, но для этого лучше использовать config.

А другой вариант - сделать то, что @inti предложил в своем ответе.

...