在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()
,您希望代码表现出不同的行为——听起来非常容易出错。。