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