从被调用函数中获取变量名

时间:2012-02-14 15:40:14

标签: php reflection

我可以这样做,也许使用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 个答案:

答案 0 :(得分:6)

您无法获取“变量”的名称,因为没有变量。

例如:

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

注意:我不确定你要做什么,但我只是觉得可怕的错误......函数和对象的全部意义在于创建障碍,并且在调用者的上下文中应该是什么并不重要。

答案 1 :(得分:2)

如果用户将对象传递给myprintr(),则可以使用

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

获取已传递的对象类型的名称,然后可以将其提供给反射

但是反射构造函数会接受一个类名一个对象作为参数,所以你甚至不需要类名来实例化一个反射类

修改

只是为了玩这个概念(并且不创建对全局变量的任何依赖),或者参数是否是变量,从函数,字符串等返回的值:

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,除非它们在括号内),但肯定距离你实际要求的步骤更近一步。

答案 2 :(得分:1)

您无法访问不存在的参数名称:myprintr未指定任何变量名称,func_get_args()将仅返回数字索引数组。

假设您可以添加docblock注释并使用反射访问它们,但这似乎是您最有可能不需要的功能的非常大量的开销。对函数的参数本身使用反射将不会为您做任何事情,因为同样,您没有在函数的参数签名中指定任何参数。

PHP函数参数是有序的。它们不是像关联数组那样可以引用的东西。如果要访问函数或方法参数的“关联”类型键名,则必须指定数组参数并使用所需的关联键传递值,如下所示:

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

答案 3 :(得分: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