Ответ 1
Это невозможно. Даже передача по ссылке вам не поможет. Вам нужно будет передать имя в качестве второго аргумента.
Но то, что вы просили, безусловно, не является хорошим решением вашей проблемы.
Возможные дубликаты:
PHP: получить имя переменной, переданной как аргумент
Как получить имя переменной как строку в PHP?
Если у меня
$abc = '123';
function write($var){
}
Как мне внутри write
узнать, что переменная, представленная теперь $var
, была вызвана $abc
?
Это невозможно. Даже передача по ссылке вам не поможет. Вам нужно будет передать имя в качестве второго аргумента.
Но то, что вы просили, безусловно, не является хорошим решением вашей проблемы.
Вы не можете получить имя переменной, но если вы хотите его для отладки, вы можете использовать встроенный PHP debug_backtrace()
, и я рекомендую взглянуть на Xdebug.
С помощью этой функции вы можете получить некоторые данные о вызывающем, включая номер файла и строки, чтобы вы могли найти эту строку вручную после запуска script:
function debug_caller_data()
{
$backtrace = debug_backtrace();
if (count($backtrace) > 2)
return $backtrace[count($backtrace)-2];
elseif (count($backtrace) > 1)
return $backtrace[count($backtrace)-1];
else
return false;
}
Полный пример:
<?php
function debug_caller_data()
{
$backtrace = debug_backtrace();
if (count($backtrace) > 2)
return $backtrace[count($backtrace)-2];
elseif (count($backtrace) > 1)
return $backtrace[count($backtrace)-1];
else
return false;
}
function write($var)
{
var_dump(debug_caller_data());
}
function caller_function()
{
$abc = '123';
write($abc);
}
$abc = '123';
write($abc);
caller_function();
В этом ответе сделаны некоторые предположения:
Обратите внимание, что функция использует проход по ссылке. Я предполагаю, что это будет необходимо для точного сравнения объектов.
function write(&$var)
{
$varname = null;
foreach ($GLOBALS as $name => $val)
{
if ($val === $var)
{
$varname = $name;
break;
}
}
}
Есть ли какая-то конкретная причина, по которой вам нужно имя var? Возможно, лучшее решение.
& крестик; Добавлен акцент на предположение № 3
Конечно, это невозможно без создания для него расширения PHP.
Вы, конечно, не хотите полагаться на это, особенно в функции. Функция не должна работать вне своей области (за исключением глобальных, но я их ненавижу).