【问题标题】:PHP Is it possible to identify the name of the variable containing the object?PHP 是否可以识别包含对象的变量的名称?
【发布时间】:2013-12-16 14:48:58
【问题描述】:

在 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 为我工作。感谢所有提出建议的人:)。

【问题讨论】:

  • 如果您可以有多个引用指向同一个对象,这是否合乎逻辑?
  • @bath:在某些情况下,游戏中的 $enemy1 = new BadGuy(); $enemy2 = new BadGuy(); ... 之类的东西可能有意义,但我想不出任何 - 周一早晨的雾气总是对提高生产力很有好处。
  • 这种情况下的结果应该是什么? $container->getObject()->getContainer()
  • 你应该在构造函数中传递一个名称。

标签: php class variables object


【解决方案1】:

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

【讨论】:

  • 没有充分的理由?尝试找出在哪里调用了 4 次呢?如果我用 4 个不同的变量创建一个类,我就有 4 个不同的实例。我正在尝试减少这个数字。
  • @Styphon:用于调试?试试这个:debug_print_backtrace
  • 哪个需要知道一个对象被实例化了多少次?
  • @Styphon 使用debug_backtrace 或实时调试器来堆栈跟踪,这样您就可以确定调用某些内容的行号。
  • @RocketHazmat 是的,这只是为了调试,我想我应该提到这一点。谢谢:)
【解决方案2】:

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

但这在理论上是可能的(这并不意味着你应该这样做..)。您可以使用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;

所以你有多个变量,它们指向同一个引用,但是如果你调用 $a->test()$b->test(),你希望你的代码表现不同 - 听起来非常非常容易出错..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多