[PHP] Как передать название константы переменную?

O
На сайте с 29.05.2008
Offline
195
7381

Здравствуйте.

Есть класс Error и метод display(), который получает в себя код ошибки (1 - фатальная, 2 - критическая, 3 - пользовательская, 4 - предупреждение) и если ошибка не фатальная, он вызывает статический метод внутри класса, который загружает константы описания ошибок из json файла. Так, же, метод display получает вторую переменную, которая как раз содержит константу описания этой ошибки. Когда языковые константы ошибок определены, метод display в зависимости от кода, должен вывести значение этой константы. Например,

Мы получили ошибку подключения к базе MySQL. Метод подключения тут же, запрашивает Error:display(2, MYSQL_ERROR). Метод парсинга языка, определяет константу LANG_MYSQL_ERROR и display выводит ее. Например, "Неизвестная ошибка подключения к базе данных".

Проблема в том, что когда я передаю название константы, я передаю ее как переменную. Как передать название константы в метод не как переменную или как хотя бы заставить ее интерпретировать при выводе не как (string) var, а как константу? Набросок кода ниже. Убрал лишнее, чтобы проблему было видно.

if (!defined('PARENT')) 
die("Fatal error");

class Error {




//Метод завантаження назв помилок в константи
static function get_language() {
$files = new Files;
if ($lang = Headers::get_language())
$files->ParseJSON(LANGS_DIR.$lang.'/errors.json', 'LANG');
else {
if (defined(CONF_DEFAULT_LANG)) $files->ParseJSON(LANGS_DIR.CONF_DEFAULT_LANG.'/errors.json', 'LANG');
else $files->ParseJSON(LANGS_DIR.'english/errors.json', 'LANG');
}
}




function display($code = null, $type = 2) {
self::get_language();
switch ($type) {
//Фатальна помилка
//Не виконується перевірка мовних констант
case 1:
die($code);
break;
//Критична помилка
case 2:
die($code);
break;
//Помилка
case 3:
echo $code;
break;
//Попередження
case 4:
echo $code;
break;
}
}
}

И еще вопрос по оптимизации скорости выполнения кода. Очень приелись константы, в качестве настроек и языковых значений. Не будут ли они работать хуже обычных глобальных массивов?

siv1987
На сайте с 02.04.2009
Offline
427
#1

А чем переменная не устраивает? Не вижу здесь вообще никакого смысла использовать константы. Они для того и константы, что их значения подразумевается что будет константным.

O
На сайте с 29.05.2008
Offline
195
#2

siv1987, так у меня настройки и не должны меняться, а главное, должны быть кругом доступные. У глобального супермассива синтаксис неудобный, поэтому, конфиги и ленгы константами.

Меня интересует вопрос производительности и как заставить интерпретироваться константу. Например, я передаю ее название в переменной $a.

<?

$a = CONST;

define ('CONST', 'br');

echo $a; // выведет CONST. Как заставить выводить br??? Какое-то там (const) как в C есть???

?>

siv1987
На сайте с 02.04.2009
Offline
427
#3
ortegas:
Например, я передаю ее название в переменной $a.

И какой здесь смысл?

define ('CONST', 'br');

$a = CONST;

echo $a;

O
На сайте с 29.05.2008
Offline
195
#4

siv1987, а смысл в том, что я изначально не знаю, какую константу мне надо вывести. Ее имя принимает метод из других классов и выводит ее. Вот как раз мне нужно, чтобы имя константы передавалось переменной? Смысл это уже мое дело. Стиль такой, что конфигурация и языковые константы должны быть константами и должны задаваться из файла json. Т.е., загрузились и усе. И дальше только для чтения и никто не может изменить ее значение. Т.е., никакие $conf['db_name'] = false уже не сработают, потому что будет CONF_DB_NAME. Ну вот представьте, загружу я конфиги в массив, буду каждом файле задавать их глобальными, обращаться к ним фиг каким именем, а тут CONF_DB_NAME и все. Но вот только значение этого, скажем, DB_NAME неизвестно, т.е. вывод констант динамический, хоть и константа статическая. Константу мы не трогаем, просто выводим в зависимости от ситуации. Ну не писать же мне для каждой константы switch.

define ('CONST', 'br');
$a = CONST;
echo $a;

Это сработает если константы уже заданы. Мне не надо передавать значение, потому что изначально константы для названия ошибок не загружаются. Надо передать только ее имя. А значение задается в самом методе. Т.е., зачем мне загружать константы ошибок, если не факт, что эта ошибка будет. Нужно по факту.

---------- Добавлено 27.05.2012 в 16:53 ----------

Пришлось, тело метода загрузки констант поместить в __construct. Так, при обращении к Error::display(название константы), константы уже автоматически загружены и интерпретируются прямо при запросе. Но все-равно, костыли это.

SI
На сайте с 03.12.2007
Offline
130
#5
ortegas:

echo $a; // выведет CONST. Как заставить выводить br??? Какое-то там (const) как в C есть???

http://php.net/manual/ru/function.constant.php

echo constant($a);

-= Онлайн сервисы =-
O
На сайте с 29.05.2008
Offline
195
#6

Sigmo#ID, вы гений! Где только не спрашивал, никто не додумался написать это, только "а зачем тебе это", "а почему переменные не используешь". Спасибо большое. Проблема решена.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий