Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从被调用函数中获取变量名_Php_Reflection - Fatal编程技术网

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

Php 从被调用函数中获取变量名,php,reflection,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... } } 您无法获取“变量”的名称,

我可以用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...
  }


}

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

例如:


注:我不知道你想做什么,但我只是觉得大错特错了。。函数和对象的全部意义在于创建障碍,调用方上下文中的内容应该无关紧要。

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

例如:


注:我不知道你想做什么,但我只是觉得大错特错了。。函数和对象的全部意义在于创建障碍,调用方上下文中的内容应该无关紧要。

如果它是一个对象,您可以使用它来识别该对象,然后在$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;
  }
}

如果它是一个对象,您可以使用和识别该对象,然后在$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;
  }
}

您无法访问不存在的参数名称:
myprintr
未指定任何变量名称,并且
func\u get\u args()
将只返回数字索引数组

我想您可以添加docblock注释并通过反射访问它们,但对于您最可能不需要的功能来说,这似乎是一个非常大的开销。对函数的参数本身使用反射不会对您有任何帮助,因为您没有在函数的参数签名中指定任何参数

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

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

您无法访问不存在的参数名称:
myprintr
未指定任何变量名称,
func\u get\u args()
将只返回数字索引数组

我想您可以添加docblock注释并通过反射访问它们,但对于您最可能不需要的功能来说,这似乎是一个非常大的开销。对函数的参数本身使用反射不会对您有任何帮助,因为您没有在函数的参数签名中指定任何参数

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

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

如果用户将对象传递给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_拆分,除非它们位于大括号内),但肯定离实际要求更近了一步。

如果用户将对象传递给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_拆分,除非它们在大括号内),但肯定离实际要求更近了一步。

你不能,除非你使用类似debug_backtrace()的东西,而且你不需要这样做。。。这是业务需求吗?或者只是探索PHP?我正在尝试为我的API创建一个print\r/var\u dump类型的函数,并且需要这个名称,以防用户传递一个对象,而我正在列出对象方法。我想在显示方法名时将变量名放在方法名之前,比如$object->method…这里可能回答:调用中使用的变量名在调用函数之外没有任何意义。。。我可以在一个地方使用$xyz,在另一个地方使用$abc,在第三个地方使用“hello world”调用myprintr()。大多数人将phpdocumentor块用于APIdocs@Alex:将向您展示您似乎对开箱即用感兴趣的内容。您不能,除非您使用诸如debug_backtrace()之类的工具,而且您实际上不需要这样做。。。这是业务需求吗?或者只是探索PHP?我正在尝试为我的API创建一个print\r/var\u dump类型的函数,并且需要这个名称,以防用户传递一个对象,而我正在列出对象方法。我想在显示方法名时将变量名放在方法名之前,比如$object->method…这里可能回答:调用中使用的变量名在调用函数之外没有任何意义。。。我可以在一个地方使用$xyz,在另一个地方使用$abc,在第三个地方使用“hello world”调用myprintr()。大多数人将phpdocumentor块用于APIdocs@Alex:威尔斯