Как получить имя переменной в виде строки в PHP?
Есть идеи как этого добиться? Это вообще возможно в PHP?
Решение
Вы могли бы использовать get_defined_vars () чтобы найти имя переменной, значение которой совпадает со значением, которое вы пытаетесь найти. Очевидно, это не всегда будет работать, поскольку разные переменные часто имеют одинаковые значения, но это единственный способ, которым я могу придумать.
Edit: get_defined_vars (), кажется, не работает правильно, он возвращает ‘var’, потому что $ var используется в самой функции. $ GLOBALS, кажется, работает, поэтому я изменил его на это.
function print_var_name($var) < foreach($GLOBALS as $var_name =>$value) < if ($value === $var) < return $var_name; >> return false; >
Изменить: чтобы было ясно, нет хорошего способа сделать это в PHP, что, вероятно, потому, что вам не нужно это делать. Вероятно, есть лучшие способы сделать то, что вы пытаетесь сделать.
Другие решения
Я не мог придумать способ сделать это эффективно, но я придумал это. Это работает, для ограниченного использования ниже.
$foo = "knight"; $bar = array( 1, 2, 3 ); $baz = 12345; varName( $foo ); varName( $bar ); varName( $baz ); ?> // Returns Array ( [0] => $foo [1] => foo ) Array ( [0] => $bar [1] => bar ) Array ( [0] => $baz [1] => baz )
Он работает на основе строки, вызвавшей функцию, где находит аргумент, который вы передали. Я полагаю, что его можно расширить для работы с несколькими аргументами, но, как говорили другие, если бы вы могли объяснить ситуацию лучше, возможно, было бы другое решение. работать лучше
Вы могли бы подумать об изменении вашего подхода и использовании имени переменной переменной?
$var_name = "FooBar"; $$var_name = "a string";
Никто, кажется, не упомянул фундаментальные причины Зачем это а) сложно и б) неразумно
- «Переменная» — это просто символ, указывающий на что-то еще. В PHP он внутренне указывает на то, что называется «zval», который может фактически использоваться для нескольких переменных одновременно, либо потому, что они имеют одно и то же значение (PHP реализует нечто, называемое «копирование при записи», так что $foo = $bar не нужно сразу выделять дополнительную память) или потому, что они были назначены (или переданы функции) по ссылке (например, $foo =& $bar ). Так что у звала нет имени.
- Когда вы передаете параметр в функцию, вы создаете новый переменная (даже если это ссылка). Вы можете передать что-то анонимное, как «hello» , но когда-то внутри вашей функции, это любая переменная, которую вы называете. Это довольно фундаментально для разделения кода: если функция полагается на переменную используемый чтобы быть названным, это было бы больше похоже на goto чем правильно отдельная функция.
- Глобальные переменные обычно считаются плохой идеей. Многие примеры здесь предполагают, что переменная, которую вы хотите «отразить», находится в $GLOBALS , но это будет верно только в том случае, если вы плохо структурировали свой код и переменные не ограничены какой-либо функцией или объектом.
- Имена переменных помогают программистам читать их код. Переименование переменных для лучшего соответствия их назначению — очень распространенная практика рефакторинга, и весь смысл в том, что это не имеет никакого значения.
Теперь я понимаю желание этого для отладки (хотя некоторые из предложенных вариантов использования выходят далеко за рамки этого), но в качестве обобщенного решения это на самом деле не так полезно, как вы думаете: если ваша функция отладки говорит, что ваша переменная называется «$ file «, это может быть любая из десятков переменных» $ file «в вашем коде или переменная, которую вы назвали» $ filename «, но передаете функции, параметр которой называется» $ file «.
Гораздо более полезная информация — это то, откуда в вашем коде была вызвана функция отладки. Поскольку вы можете быстро найти это в своем редакторе, вы можете увидеть, какую переменную вы выводили для себя, и даже можете передать целые выражения в нее за один раз (например, debug(‘$foo + $bar = ‘ . ($foo + $bar)) ).
Для этого вы можете использовать этот фрагмент вверху функции отладки:
$backtrace = debug_backtrace(); echo '# Debug function called from ' . $backtrace[0]['file'] . ' at line ' . $backtrace[0]['line'];
Я сделал функцию проверки по причинам отладки. Это похоже на print_r () на стероидах, очень похоже на Krumo, но немного более эффективно на объектах. Я хотел добавить определение имени var и получил это, вдохновленный постом Ника Престы на этой странице. Он обнаруживает любое выражение, переданное в качестве аргумента, а не только имена переменных.
Это только функция-обертка, которая обнаруживает переданное выражение.
Работает в большинстве случаев.
Это не будет работать, если вы вызываете функцию более одного раза в одной и той же строке кода.
Это отлично работает:
умереть(осмотреть( $ This-> GetUser () -> hasCredential ( «Удалить») ));
inspect () — это функция, которая обнаружит переданное выражение.
Мы получаем: $ This-> GetUser () -> hasCredential ( «Удалить»)
function inspect($label, $value = "__undefin_e_d__") < if($value == "__undefin_e_d__") < /* The first argument is not the label but the variable to inspect itself, so we need a label. Let's try to find out it's name by peeking at the source code. */ /* The reason for using an exotic string like "__undefin_e_d__" instead of NULL here is that inspected variables can also be NULL and I want to inspect them anyway. */ $value = $label; $bt = debug_backtrace(); $src = file($bt[0]["file"]); $line = $src[ $bt[0]['line'] - 1 ]; // let's match the function call and the last closing bracket preg_match( "#inspect\((.+)\)#", $line, $match ); /* let's count brackets to see how many of them actually belongs to the var name Eg: die(inspect($this->getUser()->hasCredential("delete"))); We want: $this->getUser()->hasCredential("delete") */ $max = strlen($match[1]); $varname = ""; $c = 0; for($i = 0; $i < $max; $i++)< if( $match[1]== "(" ) $c++; elseif( $match[1] == ")" ) $c--; if($c < 0) break; $varname .= $match[1]; > $label = $varname; > // $label now holds the name of the passed variable ($ included) // Eg: inspect($hello) // => $label = "$hello"// or the whole expression evaluated // Eg: inspect($this->getUser()->hasCredential("delete")) // => $label = "$this->getUser()->hasCredential(\"delete\")" // now the actual function call to the inspector method, // passing the var name as the label: // return dInspect::dump($label, $val); // UPDATE: I commented this line because people got confused about // the dInspect class, wich has nothing to do with the issue here. echo("The label is: ".$label); echo("The value is: ".$value); >
Вот пример функции инспектора (и моего класса dInspect) в действии:
Тексты на этой странице на испанском, но код лаконичен и действительно прост для понимания.
Lucas на PHP.net предоставил надежный способ проверить, существует ли переменная. В своем примере он перебирает копию массива глобальных переменных (или массива с областями видимости) переменных, изменяет значение на случайно сгенерированное значение и проверяет сгенерированное значение в скопированном массиве.
function variable_name( &$var, $scope=false, $prefix='UNIQUE', $suffix='VARIABLE' ) < if($scope) < $vals = $scope; >else < $vals = $GLOBALS; >$old = $var; $var = $new = $prefix.rand().$suffix; $vname = FALSE; foreach($vals as $key => $val) < if($val === $new) $vname = $key; >$var = $old; return $vname; >
$a = 'asdf'; $b = 'asdf'; $c = FALSE; $d = FALSE; echo variable_name($a); // a echo variable_name($b); // b echo variable_name($c); // c echo variable_name($d); // d
@Alexandre — короткое решение
echo my_local_func(); // Outputs: my_local_variable //3. Use of an object property: class myclass < public function __constructor() < $this->my_object_property = "My object property string."; > > $obj = new myclass; echo vname($obj->my_object_property, $obj); // Outputs: my_object_property ?>
Это именно то, что вы хотите — это готовая к использованию функция «копировать и вставить», которая отображает имя данной переменной:
ИСПОЛЬЗОВАНИЕ: print_var_name ($ FooBar)
ПОДСКАЗКА
Теперь вы можете переименовать функцию, и она все равно будет работать, а также использовать функцию несколько раз в одной строке! Благодаря @Cliffordlife
Как получить имя переменной в виде строки в PHP?
Скажем, у меня есть этот PHP-код:
$FooBar = «a string»;
Затем мне нужна такая функция:
print_var_name($FooBar);
которая печатает:
FooBar
Любые идеи, как этого добиться? Возможно ли это вообще в PHP?
Ответ 1
Вы можете использовать get_defined_vars(), чтобы определить имя переменной, которая имеет то же значение, что и та, имя которой вы пытаетесь найти. Очевидно, это не всегда будет работать, поскольку разные переменные часто имеют одинаковые значения, но это единственный способ, который я могу придумать для этого.
get_defined_vars() в некоторых ситуациях работает некорректно, она возвращает var, потому что $var используется в самой функции.
function print_var_name($var)
foreach($GLOBALS as $var_name => $value)
if ($value === $var)
return $var_name;
>
>
return false;
>
В PHP нет хорошего способа сделать это, вероятно, потому, что вам не нужно этого делать. Возможно, есть более эффективные способы сделать то, что вы пытаетесь сделать.
Ответ 2
Я не могу уверенно утверждать, как сделать это эффективно, но я придумал вот что. Это работает для ограниченного использования, как указа н о ниже.
function varName( $v )
$trace = debug_backtrace();
$vLine = file( __FILE__ );
$fLine = $vLine[ $trace[0][‘line’] — 1 ];
preg_match( «#\\$(\w+)#», $fLine, $match );
print_r( $match );
>
$foo = «knight»;
$bar = array( 1, 2, 3 );
$baz = 12345;
varName( $foo );
varName( $bar );
varName( $baz );
?>
// Результат
Array (
[0] => $foo [1] => foo)
Array (
[0] => $bar [1] => bar)
Array (
[0] => $baz [1] => baz)
Это работает на основе строки, вызывающей функцию, где она находит аргумент, который вы передали. Я полагаю, что его можно было бы расширить для работы с несколькими аргументами, но, если бы вы могли лучше объяснить ситуацию, вероятно, другое решение будет работать лучше.
Ответ 3
- «Переменная» — это просто символ, указывающий на что-то еще. В PHP она внутренне указывает на что-то, называемое «zval», которое на самом деле может использоваться для нескольких переменных одновременно либо потому, что они имеют одинаковое значение (PHP реализует то, что называется «копирование при записи», поэтому для $foo = $bar нет необходимости выделить дополнительную память сразу) , либо потому, что они были назначены (или переданы функции) по ссылке (например , $foo =& $bar ).
- Когда вы передаете параметр функции, вы создаете новую переменную (даже если это ссылка). Вы можете передать что-то анонимное, например , «hello» , но, оказавшись внутри вашей функции, это будет та переменная, как вы ее назовете. Это довольно фундаментально для разделения кода: если бы функция полагалась на то, как называлась переменная, она была бы больше похожа на goto, чем отдельную функцию.
- Глобальные переменные обычно считаются плохой идеей. Многие примеры здесь предполагают, что переменная, которую вы хотите «отразить», может быть найдена в $GLOBALS , но это будет верно только в том случае, если вы плохо структурировали свой код и переменные не привязаны к какой-либо функции или объекту.
- Имена переменных помогают программистам читать свой код. Переименование переменных в соответствии с их назначением — очень распространенная практика рефакторинга, и все дело в том, что это не имеет никакого значения.
Ответ 4
Это именно то, что вам нужно , — готовая к использованию функция «скопируй и вставь», которая определяет имя заданной переменной:
function print_var_name()
// читаем обратную трассировку
$bt = debug_backtrace();
// читаем файл
$file = file($bt[0][‘file’]);
// выбираем точную строку print_var_name($varname)
$src = $file[$bt[0][‘line’]-1];
// шаблон поиска
$pat = ‘#(.*)’.__FUNCTION__.’ *?\( *?(.*) *?\)(.*)#i’;
// извлечение $varname из совпадения №2
$var = preg_replace($pat, ‘$2’, $src);
// выводим в браузер
echo ‘
' . trim($var) . ' = ' . print_r(current(func_get_args()), true) . '
‘;
>
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Как узнать название переменной?
вопрос уже подымался но хотелось бы уточнить возможно ли вообще каким то образом узнать названия переменных и какими способами они посылаются (post,сессия и т д) ?
Просто заказчики дали дизайн который они хотят обновить у себя на сайте , и вот какие условия — 1. надо чтоб он был на WordPress 2. скрипта сайта они не предоставляют , а там есть форма которая отправляет данные на обработку в определенный скрипт и потом получает «какие то данные» которые нужно в новом скрипте указывать.
Вопрос — это возможно или нет?
Добавлено через 5 минут
да кстати сайт выглядит к примеру так http://www.site.com а скрипт напрявляет на https://www.site.com — это вообще как понять — это находится на разных серверах или как?
Как сделать чтобы название переменной, было значение другой переменной?
Я хочу сделать следующее: пример: $test1 = "aver"; $test2 = "12345"; В конечном итоге, я хочу.
Как узнать название папки, в которой лежит файл?
есть файл, который инклудится в другие файлы в других папках, и в зависимости от того в какую папку.
Как узнать имя переменной?
Как известно пользователю в браузер выводится не имя переменной а то что ей присвоено . Вопрос -.
Как узнать имя переданной в запросе переменной?
Как узнать имя переданной в запросе переменной? То есть известно значение переменной, а имя было.