Я использую один отдельный файл для всех констант моего приложения PHP.
class constants
{
const USERNAME = 'abc';
/*
⋮
*/
}
Для позволяет, говорят USERNAME
постоянный, значение может быть также xyz
или abc
на основе файла существует проверка. Если xyz файл существует USERNAME
значение было бы xyz
. Как я могу сделать эту регистрацию моего класса констант?
Если значение константы является переменным, то это не константа, а переменная.
Поскольку вы (правильно) пытаетесь сохранить содержимое своего приложения в капсуле и подальше от глобальной области видимости, вас может заинтересовать шаблон реестра. Реестр - это, по сути, прославленный массив, в котором хранится все, что вы добавляете в него, и который глобально доступен для всего вашего приложения.
Некоторые ресурсы:
РЕДАКТИРОВАТЬ Если вы действительно в отчаянии и должны переопределить константу, вы можете использовать
runkit_constant_redefine
- Переопределите уже определенную константу Runkit может быть недоступен, если вы находитесь на общем хостинге, и я считаю, что он нужен запах кода, но вот как вы в основном это сделаете (в начальной загрузке)
if ( file_exists('xyc') ) {
runkit_constant_redefine('Constants::USERNAME', 'xyz');
}
РЕДАКТИРОВАТЬ Еще несколько параметров (все из которых тоже не совсем красивы):
class Abc { const FOO = 1; const BAR = 2; }
class Xyz extends Abc { const FOO = 2; }
class_alias(file_exists('abc') ? 'Abc' : 'Xyz', 'Constants');
Для этого вы должны переименовать свой текущий класс констант в Abc и добавить второй класс Xyz, чтобы расширить его и перезаписать константу USERNAME (FOO в примере). Это, очевидно, нарушит ваш код, потому что вы использовали Constants :: USERNAME
, поэтому вам нужно создать псевдоним для прежнего имени класса. На какой класс будут указывать константы, решается с помощью условной проверки. Для этого требуется PHP5.3.
Решение до версии 5.3 заключалось в том, чтобы просто сохранить файл класса констант под двумя разными именами, например abc_constants.php и xyz_constants.php, измените последний соответственно, чтобы сохранить ИМЯ ПОЛЬЗОВАТЕЛЯ xyz , а затем включить
либо, либо в зависимости от проверки файла.
Или замените значение USERNAME на заполнитель и вместо того, чтобы включать класс, вы загружаете его в переменную в виде строки. Затем вы заменяете заполнитель в соответствии с результатом проверки файла и eval
строкой, эффективно включая таким образом класс.
Но я должен сказать это еще раз: я настоятельно рекомендую реорганизовать ваш код вместо их использования.
Невозможно иметь определения условных констант внутри классов.
Разве это: PHP Readonly Properties? не проще?
Мне кажется, вы пытаетесь неправильно использовать константы.
http://us2.php.net/manual/en/function.define.php
if ( $file_exists )
{
define('MYCONSTANT', 'YEAH');
}
else
{
define('MYCONSTANT', 'NOPE');
}