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

Posted

技术标签:

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

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

谢谢

【问题讨论】:

是的,我需要,例如,如果我想知道变量是其他变量的副本还是指向同一变量的指针 你的设计在你需要的时候被打破了。 与Detecting whether a variable is a reference不重复相关 @Gordon 公平地说,他可能在非传统环境中使用 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

【讨论】:

也许这可以帮助你... =D : php.net/manual/en/language.references.spot.php#102177【参考方案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 相同,但可能更容易理解。)

【讨论】:

这是否比php.net/manual/en/language.references.spot.php#72203 的更详细的代码(看起来做同样的事情)更好?

以上是关于如何在php中检查变量的内存位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Elixir中获取变量的内存位置?

检查 PHP 中的真实数组标识?

linux下进程内存布局及变量存储位置检查

如何从本地的 PHP session_start() 检查不同的变量? [复制]

C如何检查内存地址是不是仍在范围内[关闭]

如何在Simulink中实现变量存储