PHP是否可以识别包含对象的变量的名称


PHP Is it possible to identify the name of the variable containing the object?

在PHP中,是否可以识别包含对象的变量的名称?例如:

class Foo {
    public function IdentifyContainer() {
        //PHP to identify variable containing Foo.
    }
}
$bar = new Foo();
echo $bar->IdentifyContainer(); // This should echo "bar";

我不知道这是否可以做到,但如果可以的话,这将对我有很大帮助,因为我在一个页面加载中调用了同一类的4个实例,我正在努力识别它们。

编辑

我本来应该提到这纯粹是为了调试。debug_backtrace为我工作。感谢所有提出建议的人:)。

没有,没有任何理智的方式。也没有充分的理由这么做。不,即使你认为你有充分的理由,你也没有。由于完全可以同时将一个对象分配给多个变量,因此对象(或任何值)与分配给它的变量之间没有内在的联系。变量不是"容器",变量是算法中的占位符,可以引用更改(变量)值。

没有简单的方法可以做到这一点。

但理论上这是可能的(这并不意味着你应该这样做…)。你可以使用debug_backtrace来获取调用堆栈,以获取调用脚本的文件和行号。有了这些信息,您可以打开php文件(fopen等)来获取行内容,使用正则表达式,您可以获取var的名称,调用您的方法。

概念简介:

function getCallingVarName() {
    $trace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2);
    array_shift($trace);
    $call = $trace[0];
    $file = $call['file'];
    $fnc = $call['function'];
    $lines = file($file);
    $line = $lines[$call['line'] - 1];
    if (preg_match('~'$([^-]+)->' . $fnc . ''(~', $line, $m)) {
        return $m[1];
    }
}

所以,这是可能的,但有一些不这样做的原因:

  • 这太慢了
  • 这是不安全的(有人可能将多个语句放在php文件的同一行)

你应该这么做的一些原因:

$a = new A();
$b = $a;

因此,您有多个var,它们指向相同的引用,但如果您调用$a->test()$b->test(),您希望代码表现出不同的行为——听起来非常容易出错。。