PHP是否可以识别包含对象的变量的名称?
在PHP中,是否可以识别包含对象的变量的名称?例如:PHP是否可以识别包含对象的变量的名称?,php,class,variables,object,Php,Class,Variables,Object,在PHP中,是否可以识别包含对象的变量的名称?例如: class Foo { public function IdentifyContainer() { //PHP to identify variable containing Foo. } } $bar = new Foo(); echo $bar->IdentifyContainer(); // This should echo "bar"; 我不知道这是否可以实现,但如果可以的话,它将真正帮助
class Foo {
public function IdentifyContainer() {
//PHP to identify variable containing Foo.
}
}
$bar = new Foo();
echo $bar->IdentifyContainer(); // This should echo "bar";
我不知道这是否可以实现,但如果可以的话,它将真正帮助我,因为我在一个页面加载中调用了同一个类的4个实例,我正在尝试识别它们
编辑
我本来应该提到这纯粹是为了调试<代码>调试\u回溯对我很有效。感谢所有提出建议的人:)。不,一点也不理智。也没有任何理由这样做。不,即使你认为你有充分的理由,你也没有。由于一次将一个对象分配给多个变量是完全可能的,因此对象(或任何值)和分配给它的变量之间没有内在联系。变量不是“容器”,变量是算法中的占位符,允许您引用更改的(变量)值。没有简单的方法可以做到这一点 但这在理论上是可能的(这并不意味着你应该这样做)。您可以使用
debug\u 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;
因此,您有多个变量,它们指向同一引用,但如果调用
$a->test()
或$b->test()
,您希望代码的行为会有所不同,这听起来非常,非常容易出错。如果您可以有多个引用引用同一个对象,那么这是否合乎逻辑?@bath:类似于$enemy1=new BadGuy()$enemy2=新坏人()代码>在游戏中可能在某些情况下是有意义的,但我想不出有任何意义-周一早上的大雾总是有助于提高效率。在这种情况下,结果应该是什么<代码>$container->getObject()->getContainer()
您应该在构造函数中传递一个名称。没有好的理由吗?试着找出这被呼叫了4次的地方怎么样?如果我用4个不同的变量创建一个类,那么我有4个不同的实例。我正试图减少这个数字。@Styphon:为了调试?试试这个:需要知道一个对象被实例化了多少次吗?@Styphon使用debug\u backtrace
或一个实时调试器来堆栈跟踪,这样你就可以计算出调用对象的行号。@RocketHazmat是的,这只是为了调试,我想我应该提到这一点。谢谢:)