如何在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中检查变量的内存位置?的主要内容,如果未能解决你的问题,请参考以下文章