【问题标题】:How check memory location of variable in php?如何在php中检查变量的内存位置?
【发布时间】:2011-07-06 10:16:41
【问题描述】:

如何在php中查看变量的内存位置?

谢谢

【问题讨论】:

  • 是的,我需要,例如,如果我想知道变量是其他变量的副本还是指向同一变量的指针
  • 你的设计在你需要的时候被打破了。
  • @Gordon 公平地说,他可能在非传统环境中使用 PHP,他必须知道他的数据的内存地址。系统可能不是他设计的……

标签: php


【解决方案1】:

如果您需要知道 $varA 是否是对 $varB 的引用,那么您就不走运了:PHP 内部不会向开发人员提供此信息。

但是,您可以通过解析 var_dump 或 debug_zval_dump() 的输出来提取有关引用的一些信息。阅读相关手册部分,并查看this question 了解一些详细信息。

并准备好由 Derick Rethans 撰写的this (PDF) article PHP 参考资料。

使用 debug_zval_dump() 时要注意引用计数,因为该函数总是在自身内部创建一个额外的引用,将值递增 1

【讨论】:

  • 感谢文章的链接!
【解决方案2】:

如果您需要知道一个变量是否是对另一个变量的引用,那么debug_zval_dump() 是唯一的选择。

【讨论】:

  • 从未听说过debug_zval_dump()。非常有趣,谢谢!
【解决方案3】:

抱歉,这是不可能的 [1]

它们不像 C 指针;为了 例如,您不能执行指针 算术使用它们

[1]http://php.net/manual/en/language.references.php

【讨论】:

【解决方案4】:

要测试一个变量是否是对另一个变量的引用,您可以执行以下操作:

function is_ref_to(&$a, &$b)
{
    $t = $a;
    if($r=($b===($a=1))){ $r = ($b===($a=0)); }
    $a = $t;
    return $r;
}

【讨论】:

    【解决方案5】:

    我相当肯定这在 PHP 中是不可能的。您也许可以创建一个扩展来执行此操作,但我看不出它有什么用处。由于解释器处理所有内部变量的工作,内存地址在 PHP 脚本中是无用的。在 PHP 之外(比如用 C 或 C++ 操作内存地址)至少可以说是危险的。如果您修改了 PHP 脚本在执行时使用的内存地址,我希望您可能会导致脚本崩溃,并且可能会导致您的解释器崩溃。
    但是,如果您正在寻找 PHP 中的内部指针,请查看 references。可能需要阅读一些内容才能理解它们,但如果您需要通过引用传递,请查看它们。快速示例:

    <?php
    function change( &$name ) { $name = "Yosef"; }
    $name = "John";
    change( $name );
    echo $name;
    ?>
    

    【讨论】:

      【解决方案6】:

      正如其他人所说,API 没有公开检索值地址的方法。但是,您可以比较两个值的地址,给定两个变量。这是一个测试两个变量是否引用相同值的函数:

      function vars_reference_same_value(&$a, &$b)
      {
        $not_b = $b === 0 ? 1 : 0;
        $a_orig = $a;
        $a = $not_b;
        $is_ref = $b === $not_b;
        $a = $a_orig;
        return $is_ref;
      }
      

      (这与@infinity's answer 相同,但可能更容易理解。)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-08
      • 2018-04-02
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多