Имя исходной переменной передается функции?

Возможные дубликаты:
PHP: получить имя переменной, переданной как аргумент
Как получить имя переменной как строку в PHP?

Если у меня

$abc = '123';

function write($var){

}

Как мне внутри write узнать, что переменная, представленная теперь $var, была вызвана $abc?

Ответ 1

Это невозможно. Даже передача по ссылке вам не поможет. Вам нужно будет передать имя в качестве второго аргумента.

Но то, что вы просили, безусловно, не является хорошим решением вашей проблемы.

Ответ 2

Вы не можете получить имя переменной, но если вы хотите его для отладки, вы можете использовать встроенный 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();

Ответ 3

В этом ответе сделаны некоторые предположения:

  • что он работает (я его не тестировал)
  • что вы только, проходящие в объявленных глобально переменных
  • , что передаваемая переменная уникальна или объект & dagger;.

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

function write(&$var)
{
  $varname = null;
  foreach ($GLOBALS as $name => $val)
  {
    if ($val === $var)
    {
      $varname = $name;
      break;
    }
  }
}

Есть ли какая-то конкретная причина, по которой вам нужно имя var? Возможно, лучшее решение.

& крестик; Добавлен акцент на предположение № 3

Ответ 4

Конечно, это невозможно без создания для него расширения PHP.

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