Я знаю, что это не совсем отражение, но как бы то ни было. Я хочу сделать функцию отладки, которая получает переменную и печатает 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
это, чтобы найти что-то, что соответствует значению вашей переменной. Это очень хакерский и не очень надежный метод. Ваш оригинальный метод является наиболее эффективным способом.
Не изящно … НО ВЫ МОЖЕТЕ ПОЛУЧИТЬ ЭТО !
$a = 10 //becomes $a = '0a'; $$a = 10;
Добавление: делайте это только в том случае, если вы
Нет, тем ближе вы получите с 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 являются ключевыми
Надеюсь это поможет