Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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_Class_Variables_Object - Fatal编程技术网

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"; 我不知道这是否可以实现,但如果可以的话,它将真正帮助

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

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是的,这只是为了调试,我想我应该提到这一点。谢谢:)