Я пытаюсь реализовать библиотеку ведения журнала, которая будет извлекать текущий уровень отладки из среды, в которой работает приложение:
23 $level = $_SERVER['DEBUG_LEVEL'];
24 $handler = new StreamHandler('/var/log/php/php.log', Logger::${$level});
Когда я это делаю, код выдает ошибку:
A valid variable name starts with a letter or underscore,followed by any number of letters, numbers, or underscores at line 24.
Как мне таким образом использовать определенный уровень Logger::?
Обновлено:
Я пробовал иметь $level = "INFO" и заменить ${$level} на $$level. Ни одно из этих изменений не помогло.
Однако при замене строки 24 на $handler = new StreamHandler('/var/log/php/php.log', Logger::INFO); код компилируется и работает должным образом.
Сама переменная объявлена здесь
PHP Version => 5.6.99-hhvm
Это работает нормально, поэтому я предполагаю, что $ level недействителен, как сказал мистер Гласс. 3v4l.org/6Fo5o Я обычно представляю переменные переменные как $$level.
Как указывает @MrGlass, $level, вероятно, содержит недопустимый символ. Имейте в виду, что эта ошибка также будет выдана из-за недопустимого имени свойства класса, переменная может немного сбивать с толку в этом контексте.
@MrGlass, даже если я изменю переменную на $ level = "INFO", ошибка все равно останется. Также попытался использовать вместо этого уровень $$. Тот же результат.
как вы объявляете свой статический класс var - не могли бы вы добавить код?
@Reflective, думаю, здесь объявлено: github.com/Seldaek/monolog/blob/…
единственная связанная статическая переменная, которую я вижу, - это protected static $levels, поэтому, если вы хотите получить эту переменную, напишите именно Logger::$levels, которая вернет значение этой переменной
@Reflective pardon, я посмотрел не на ту строку. Я предполагаю, что интерфейс реализует здесь INFO как константу: github.com/Seldaek/monolog/blob/… Итак, я действительно хочу каким-то образом добраться до этой константы. Если я сделаю $ levels, он предоставит мне весь массив, что не является намерением.
хорошо, теперь я вижу, чего вы хотите достичь. Я не уверен и не пробовал, но, возможно, Logger::constant($level) может помочь. Конечно, вы всегда можете сделать следующее $logger_levels = Logger::$levels; $reversed_logger_levels = array_flip($logger_levels); $l = $reversed_logger_levels[$level];
@ Отражающий. Хорошо, второй вариант выглядит довольно некрасиво, но вы правы, есть функция constant(), которая делает то, что я хочу.






Итак, ответ заключался в использовании функции для постоянного поиска:
$handler = new StreamHandler('/var/log/php/php.log', constant("Monolog\Logger::" . $level));
<?php
class Logger {
const MY = 1;
}
$lookingfor = 'MY';
// approach 1
$value1 = (new ReflectionClass('Logger'))->getConstants()[$lookingfor];
// approach 2
$value2 = constant("Logger::" . $lookingfor);
echo "$value1|$value2";
?>
Результат: «1 | 1»
: shrug: определенно предпочитаю 2-й вариант по причине того, что он является встроенным языком, имеет более 0 документации и простоту. Я думаю, что большинство людей предпочло бы по возможности избегать размышлений. Таким образом, хотя переменная содержит 1: 1, код функционально и структурно не эквивалентен.
Да, но избежать ошибок из-за пропущенных констант сложно.
поэтому я заключу его в обработчик исключений.
Я предполагаю, что ошибка означает, что
$levelсодержит число или другой недопустимый символ? Если ваш$levelсодержит допустимое имя переменной PHP, вам может понадобиться удалить{}, чтобы получитьLogger::$$level.