Получить имя переменной из вызываемой функции - PullRequest
1 голос
/ 14 февраля 2012

Могу ли я сделать это, возможно, используя ReflectionClass?

myprintr($some_object);


function myprintr(){
  foreach(func_get_args() as $key => $arg){

    // here I want to get the name of the passed variable, "some_object"
    // $key seems to be numeric...
  }


}

Ответы [ 4 ]

6 голосов
/ 14 февраля 2012

Вы не можете получить имя «переменной», так как нет переменной.

например:

myprintr("test");
myprintr(myotherfun());

Примечание: я не уверен, что вы пытаетесь сделать, но я просто чувствую себя ужасно неправильно ... весь смысл функций и объектов в том, чтобы создавать барьеры, и не должно иметь значения, что находится в контексте вызывающего. .

2 голосов
/ 14 февраля 2012

Если пользователь передает объект в myprintr (), вы можете использовать

if (is_object($arg)) {
    $className = get_class($arg);
}

, чтобы получить имя типа объекта, который был передан, который затем можно передать в отражение

но конструктор отражения примет либо имя класса , либо объект в качестве аргумента, поэтому вам даже не нужно имя класса для создания экземпляра класса отражения

EDIT

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

class Test{};

function myTest() {
    $some_object = new Test();
    myprintr($some_object);
}

function myprintr(){
    $callStack = debug_backtrace();
    $calledAt = $callStack[0];

    $callingFile = file($calledAt['file'],FILE_IGNORE_NEW_LINES);
    $callingLine = $callingFile[$calledAt['line']-1];
    $callingLine = substr($callingLine,strpos($callingLine,__METHOD__));
    $calledWithArgNames = trim(substr($matches[0],1,-1));

    var_dump($calledWithArgNames);

    $args = func_get_args();

    foreach($args as $arg) {
        var_dump($arg);
    }
}

myTest();

$some_object = new Test();
$some_other_object = &$some_object;

$t = 2;
$gazebo = "summer house";
$visigoth = pi() / 2; myprintr($some_other_object,pi(), atan2(pi(),$t), $visigoth, "Hello $t World", $gazebo); $t = log($t/$visigoth);

Получает все аргументы, переданные вызывающей функцией в $ namedWithArgNames, поэтому для первого вызова, который у вас есть:

'$some_object'

и для второго звонка:

'$some_other_object,pi(), atan2(pi(),$t), $visigoth, "Hello $t World", $gazebo'

Это по-прежнему требует разделения на отдельные аргументы (preg_split на запятые, кроме случаев, когда они внутри скобок), но, безусловно, на шаг ближе к тому, что вы на самом деле запрашиваете.

1 голос
/ 14 февраля 2012

Вы не можете получить доступ к именам аргументов, которые не существуют: myprintr не указывает имена переменных, а func_get_args() будет только когда-либо возвращать массив с нумерацией.

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

Упорядочены аргументы функции PHP.Это не то, на что вы можете ссылаться, как ассоциативный массив.Если вы хотите получить доступ к именам ключей «ассоциативного» типа для аргументов функции или метода, вам необходимо указать аргумент массива и передать значение с требуемыми ассоциативными ключами, например:

myfunc(array $args=[])
{
  $key1 = isset($args['key1']) ? $args['key1'] : NULL;
  $key2 = isset($args['key2']) ? $args['key2'] : NULL;
}
0 голосов
/ 14 февраля 2012

Если это объект, вы можете использовать func_get_args () и spl_object_hash () , чтобы идентифицировать объект и затем искать его в $ GLOBALS.Там вы найдете название.

class Test{};
$some_object = new Test();
myprintr($some_object);

function myprintr(){
  $args = func_get_args();
  $id = spl_object_hash($args[0]);
  foreach($GLOBALS as $name => $value)
  {
     if (is_object($value) && spl_object_hash($value) == $id) echo $name;
  }
}

http://codepad.org/gLAmI511

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...