Intereting Posts
удалить запись в базе данных-php Отправка данных с использованием POST в Python для PHP PHP и MySQL: сравнение месяца и дня с динамическим годом Загрузите много файлов на клиентской стороне и сжимайте их, затем загрузите файл сжатия на сервер PHP CodeIgniter: файл не загружается достаточно быстро, и он продолжает процесс без файла как использовать константу из класса в качестве определения аргумента в php-функции? Отправить кнопку не будет показывать результат одним щелчком мыши, это покажет его вторым кликом Класс «Memcache» не найден и PHP Laravel, не отслеживайте маршруты с помощью `antonioribeiro / tracker` Как я могу поставить условие на способ соединения? PHP регулярное выражение для расшифровки английского и китайского символов PHP mysqli подготовил операторы, удаляющие ведущие нули получить идентификатор текстового поля из этой html-формы с помощью jQuery «Привет, мир» в PHP ничего не показывает Как объединить 3 массива в один большой массив (те же ключи)

Есть ли способ получить имя переменной? PHP – отражение

Я знаю, что это не совсем отражение, но как бы то ни было. Я хочу сделать функцию отладки, которая получает переменную и печатает var_dump и имя переменной.

Конечно, когда программист пишет вызов функции, они уже знают имя переменной, поэтому они могут написать что-то вроде:

debug( $myvar, 'myvar' ); 

Но я хочу, чтобы это было быстро и легко писать, просто имя функции, переменную и вуаля!

 debug( $myvar ); // quicker and easier :) 

Вы можете сделать это, преобразов переменную в набор ключей / значений, прежде чем передавать ее функции.

 function varName($theVar) { $variableName = key($theVar); $variableValue = $theVar[$variableName]; echo ('The name of the variable used in the function call was '.$variableName.'<br />'); echo ('The value of the variable used in the function call was '.$variableValue.'<br />'); } $myVar = 'abc'; varName(compact('myVar')); 

Хотя я не рекомендую создавать ссылку на безымянную переменную, также function varName(&$theVar) .

Так как compact () принимает имя переменной как строку, а не фактическую переменную, то итерация по списку имен переменных должна быть простой.

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

Я знаю, что отвечаю на 4-летний вопрос, но какого черта …

compact () может помочь вам, ваш друг здесь!

Я сделал аналогичную функцию, чтобы быстро выгрузить информацию о нескольких выбранных переменных в журнал для отладки ошибок, и это выглядит примерно так:

 function vlog() { $args = func_get_args(); foreach ($args as $arg) { global ${$arg}; } return json_encode(compact($args)); } 

Я обнаружил, что JSON является самой чистой и наиболее читаемой формой для этих дампов для моих журналов, но вы также можете использовать что-то вроде print_r () или var_export ().

Вот как я его использую:

 $foo = 'Elvis'; $bar = 42; $obj = new SomeFancyObject(); log('Something went wrong! vars='.vlog('foo', 'bar', 'obj')); 

И это будет печататься таким образом в журналах:

Что-то пошло не так! vars = {"foo": "Elvis", "bar": 42, "obj": {"nestedProperty1": 1, "nestedProperty2": "и т. д."}}

Слово предупреждения: это будет работать только для переменных, объявленных в глобальной области (так что не внутри функций или классов). Там вам нужно вызвать compact () напрямую, чтобы он имел доступ к этой области, но на самом деле это не так много потому что этот vlog () – это просто ярлык для json_encode (compact ('foo', 'bar', 'obj')), сохраняя при этом 16 нажатий клавиш каждый раз, когда мне это нужно.

Нет, не возможно. Сожалею.

У меня была такая же мысль раньше, но если вы действительно думаете об этом, вы поймете, почему это невозможно … предположительно, ваша функция debug будет определяться следующим образом: function debug($someVar) { } и нет никакого способа для он должен знать, что исходная переменная называлась $myvar .

Абсолютно лучшее, что вы могли бы сделать, это посмотреть на что-то вроде get_defined_vars() или $_GLOBALS (если это было глобально по какой-то причине) и $_GLOBALS это, чтобы найти что-то, что соответствует значению вашей переменной. Это очень хакерский и не очень надежный метод. Ваш оригинальный метод является наиболее эффективным способом.

Не изящно … НО ВЫ МОЖЕТЕ ПОЛУЧИТЬ ЭТО !

  • 1) Пейте достаточно, чтобы убедить себя, что это хорошая идея (это потребует многого)
  • 2) Замените все переменные переменными:
 $a = 10 //becomes $a = '0a'; $$a = 10; 
  • 3) Ссылка $$ a во всем вашем коде.
  • 4) Когда вам нужно распечатать переменную, напечатайте $ a и разделите ведущее 0.

Добавление: делайте это только в том случае, если вы

  • Никогда не показывать этот код никому
  • Никогда не нужно менять или поддерживать этот код
  • Сумасшедшие
  • Не делать это для работы
  • Послушай, просто никогда не делай этого, это шутка

Нет, тем ближе вы получите с get_defined_vars ().

EDIT : я был не прав, прочитав комментарии пользователя на get_defined_vars (), это возможно с небольшим взломом:

 function ev($variable){ foreach($GLOBALS as $key => $value){ if($variable===$value){ echo '<p>$'.$key.' - '.$value.'</p>'; } } } $lol = 123; ev($lol); // $lol - 123 

Тем не менее, работает только для уникального содержимого переменной.

Бит поздно в игре здесь, но Mach 13 имеет интересное решение: как получить имя переменной как строку в PHP

Вы можете использовать eval:

 function debug($variablename) { echo ($variablename . ":<br/>"); eval("global $". $variablename . ";"); eval("var_dump($" . $variablename . ");"); } 

Использование: debug("myvar") не debug($myvar)

Я считаю, что Alix и nickf предлагают следующее:

 function debug($variablename) { echo ($variablename . ":<br/>"); global $$variablename; // enable scope var_dump($$variablename); } 

Я тестировал его и, похоже, работал так же хорошо, как и код Ваггера (Спасибо Wagger: Я много раз пытался это написать, и объявление глобальной переменной было моим камнем преткновения)

Это поздний пост, но я думаю, что теперь можно использовать compact метод

поэтому код будет

 $a=1; $b=2; $c=3 var_dump(compact('a','b','c')); 

выход будет

 array (size=3) 'a' => int 1 'b' => int 2 'c' => int 3 

где имя переменной a, b и c являются ключевыми

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