Удалите константы с помощью define / apc_define_constants в PHP - PullRequest
1 голос
/ 07 февраля 2010

Я использую константы для вывода сообщений на разных языках. Например, если пользователь выберет «Английский», потребуется файл с этой константой:

define('welcomeMessage','Welcome!');

Если она выберет «Испанский»:

define('welcomeMessage','Bien Venidos!');

и т. Д. И т. Д. *

Проблема возникает, когда пользователь перебирает языки. Я не могу переопределить константы с помощью define / apc_define_constants (насколько я знаю). Могу ли я удалить и переопределить их?

Есть ли хорошее решение для этого?

Ответы [ 5 ]

5 голосов
/ 07 февраля 2010

Не имеет смысла использовать константу, если значение может быть изменено позже. Я бы порекомендовал создать статический класс, в котором вы можете установить язык, и вместо использования констант вы получите приветственное сообщение от этого класса. Допустим, класс был назван Lang:

Lang::setLang('spanish');
Lang::getWelcome();

Метод getWelcome () проверяет значение lang, установленное с помощью setLang (), и возвращает соответствующую переведенную строку.

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

4 голосов
/ 07 февраля 2010

Константы , созданные с помощью define(), не могут быть определены после создания.

Константы, созданные с помощью apc_define_constants(), можно удалить, передав в функцию пустой массив.

Я не уверен, что понимаю, почему это проблема. Что вы имеете в виду "пользователь перебирает языки"? Как только запрос вернется к пользователю и он сгенерирует новый запрос (через перенаправление, отправку формы, щелчок по ссылке или создание запроса AJAX), вы сможете сами определять любые константы, которые вам нравятся, в новом вызове. 1013 *

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

0 голосов
/ 02 июня 2011

Вот что я делаю, когда мне нужны «константы», которые нужно переопределить (как бы забавно это не звучало):

// somewhere in your global file

function config($key, $value) {
    $GLOBALS[$key] = $value;
}

function conf($key) {
    return $GLOBALS[$key];
}

function configured($key) {
    return isset($GLOBALS[$key]);
}

Теперь, когда вам нужно определить «константу», просто используйте:

config('SHOW_AVATAR', true);

Когда вам нужно получить к нему доступ, используйте:

if(conf('SHOW_AVATAR') === true)
  echo "AVATAR";

Если вам нужно проверить, определено ли оно уже, используйте:

if(configured('SHOW_AVATAR'))
  echo "Setting set";

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

Надеюсь, это поможет вам.

0 голосов
/ 07 февраля 2010

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

Языковой класс должен абстрагироваться от всех деталей.

$language = new Language('english');
$welcomeString = $language->get('welcomeMessage');
....
$language = new Language('spanish');
$welcomeString = $language->get('welcomeMessage');

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

0 голосов
/ 07 февраля 2010

Я не знаю, как пользователь меняет свой язык во время выполнения, но константы не должны быть изменены или переопределены во время выполнения.
Рассмотрите возможность использования глобальных переменных.

...