2012-02-14 3 views
1

Могу ли я сделать это, возможно, используя 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... 
    } 


} 
+1

Вы не можете, если вы не используете что-то вроде debug_backtrace(), и вам не должно быть никакой необходимости в этом ... это бизнес-требование? или просто изучать PHP? –

+0

Я пытаюсь создать функцию print_r/var_dump для моего API и нуждаюсь в этом имени, если пользователь передает объект, и я перечисляю методы объекта. Я хочу добавить имя переменной к именам методов при их отображении, например $ object-> method ... – Alex

+0

Возможно, ответ на этот вопрос: http://stackoverflow.com/questions/255312/how-to-get-a-variable -name-as-a-string-in-php –

ответ

2

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

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

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

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

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); 

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

'$some_object' 

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

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

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

+0

Я использую это уже как префикс для статических методов. Для нестатических методов я хотел отобразить это имя переменной, но если это невозможно, я просто использую имя класса. – Alex

6

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

например:

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

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

+0

Для объектов там это способ: http://stackoverflow.com/a/9279778/956397 – PiTheNumber

+0

@PiTheNumber: это работает только с глобальными ... и если объекты хранятся в нескольких переменных, как вы узнаете, какой из них выбрать? –

0

Если это объект, вы можете использовать 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

+0

Что делать, если объект не определен в $ GLOBALS? –

+0

hey it works: D – Alex

+0

@MarkBaker Возможно, вы можете использовать 'get_defined_vars()' для этого случая ... – PiTheNumber

1

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

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

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

myfunc(array $args=[]) 
{ 
    $key1 = isset($args['key1']) ? $args['key1'] : NULL; 
    $key2 = isset($args['key2']) ? $args['key2'] : NULL; 
} 
+0

Я тоже участвую в этом, поэтому, пожалуйста, дайте мне знать, что не так с ответом, когда вы делаете downvote. Особенно, если есть проблема, таким образом он может быть изменен или удален. Спасибо, задним числом, за то, что вам нужна помощь. – rdlowrey

+0

Ничего, насколько я могу судить. –

Смежные вопросы