2011-02-03 4 views
2

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

Как я могу реализовать систему конфигурации, которая позволяет мне изменять настройки основного 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)... 

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

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

+1

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

+0

, потому что мне нужен постоянный массив :) И я не хочу использовать глобальные переменные – Alex

+0

Используете ли вы среду MVC? – xil3

ответ

5

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

// 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) { 
    // ... 
} 

EDIT: 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) { 
    // ... 
} 
+0

Немного другая концепция, поскольку общедоступная статическая переменная является изменяемой, тогда как константы не являются. ('MCo :: $ BLA ['foo' ] = 'bar'; ') ... Но, возможно, достойная альтернатива – ircmaxell

+0

Да, такая же концепция, которую я предложил в качестве комментария к ней - с использованием синглтона. – xil3

+0

Вы можете сделать его доступным только для чтения массивом, получив ArrayObject и делает offsetSet() NOP. – mario

1

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

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

+0

, потому что это а не реальная «конфигурация», это больше похоже на конфигурацию кода :) в реальной конфигурации используется база данных. В основном у меня есть сценарий1 (CMS-подобная система, которую я использую для разных клиентов), которая имеет эти константы. Затем я создаю другие скрипты (2,3 ..), которые могут использовать script1. Поэтому я могу определить эти константы в сценарии 2,3 и т. Д. (Которые похожи на «модули» для этой простой CMS), чтобы изменить эту конфигурацию в сценарии1 ... Таким образом, мне не нужно изменять скрипт1 для каждого клиента, я могу сделайте это из модулей ... Может ли это быть сделано с помощью одноэлементного класса, как вы упомянули? Если да, то как? – Alex

1

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

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

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

doSomething($config); 

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

+0

Мне нужно, чтобы получить конфигурацию. эта конфигурация не извлекается из db, значения устанавливаются в скрипте, точно так же, как константа установлена ​​ – Alex

1

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

+0

Я переписал вопрос, чтобы лучше объяснить, что я ищу :) – Alex