Использование имен динамических переменных для вызова статической переменной в PHP

Я пытаюсь реализовать библиотеку ведения журнала, которая будет извлекать текущий уровень отладки из среды, в которой работает приложение:

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 содержит число или другой недопустимый символ? Если ваш $level содержит допустимое имя переменной PHP, вам может понадобиться удалить {}, чтобы получить Logger::$$level.

Mr Glass 03.07.2018 19:50

Это работает нормально, поэтому я предполагаю, что $ level недействителен, как сказал мистер Гласс. 3v4l.org/6Fo5o Я обычно представляю переменные переменные как $$level.

Devon 03.07.2018 19:55

Как указывает @MrGlass, $level, вероятно, содержит недопустимый символ. Имейте в виду, что эта ошибка также будет выдана из-за недопустимого имени свойства класса, переменная может немного сбивать с толку в этом контексте.

Niellles 03.07.2018 19:56

@MrGlass, даже если я изменю переменную на $ level = "INFO", ошибка все равно останется. Также попытался использовать вместо этого уровень $$. Тот же результат.

user3081519 03.07.2018 19:57

как вы объявляете свой статический класс var - не могли бы вы добавить код?

Reflective 03.07.2018 20:02

@Reflective, думаю, здесь объявлено: github.com/Seldaek/monolog/blob/…

user3081519 03.07.2018 20:06

единственная связанная статическая переменная, которую я вижу, - это protected static $levels, поэтому, если вы хотите получить эту переменную, напишите именно Logger::$levels, которая вернет значение этой переменной

Reflective 03.07.2018 20:14

@Reflective pardon, я посмотрел не на ту строку. Я предполагаю, что интерфейс реализует здесь INFO как константу: github.com/Seldaek/monolog/blob/… Итак, я действительно хочу каким-то образом добраться до этой константы. Если я сделаю $ levels, он предоставит мне весь массив, что не является намерением.

user3081519 03.07.2018 20:17

хорошо, теперь я вижу, чего вы хотите достичь. Я не уверен и не пробовал, но, возможно, Logger::constant($level) может помочь. Конечно, вы всегда можете сделать следующее $logger_levels = Logger::$levels; $reversed_logger_levels = array_flip($logger_levels); $l = $reversed_logger_levels[$level];

Reflective 03.07.2018 20:30

@ Отражающий. Хорошо, второй вариант выглядит довольно некрасиво, но вы правы, есть функция constant(), которая делает то, что я хочу.

user3081519 03.07.2018 20:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
10
389
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Итак, ответ заключался в использовании функции для постоянного поиска:

$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, код функционально и структурно не эквивалентен.

user3081519 03.07.2018 21:26

Да, но избежать ошибок из-за пропущенных констант сложно.

Reflective 03.07.2018 21:42

поэтому я заключу его в обработчик исключений.

user3081519 03.07.2018 22:45

Другие вопросы по теме