【发布时间】:2011-07-06 10:16:41
【问题描述】:
如何在php中查看变量的内存位置?
谢谢
【问题讨论】:
-
是的,我需要,例如,如果我想知道变量是其他变量的副本还是指向同一变量的指针
-
你的设计在你需要的时候被打破了。
-
@Gordon 公平地说,他可能在非传统环境中使用 PHP,他必须知道他的数据的内存地址。系统可能不是他设计的……
标签: php
如何在php中查看变量的内存位置?
谢谢
【问题讨论】:
标签: php
如果您需要知道 $varA 是否是对 $varB 的引用,那么您就不走运了:PHP 内部不会向开发人员提供此信息。
但是,您可以通过解析 var_dump 或 debug_zval_dump() 的输出来提取有关引用的一些信息。阅读相关手册部分,并查看this question 了解一些详细信息。
并准备好由 Derick Rethans 撰写的this (PDF) article PHP 参考资料。
使用 debug_zval_dump() 时要注意引用计数,因为该函数总是在自身内部创建一个额外的引用,将值递增 1
【讨论】:
如果您需要知道一个变量是否是对另一个变量的引用,那么debug_zval_dump() 是唯一的选择。
【讨论】:
debug_zval_dump()。非常有趣,谢谢!
【讨论】:
要测试一个变量是否是对另一个变量的引用,您可以执行以下操作:
function is_ref_to(&$a, &$b)
{
$t = $a;
if($r=($b===($a=1))){ $r = ($b===($a=0)); }
$a = $t;
return $r;
}
【讨论】:
我相当肯定这在 PHP 中是不可能的。您也许可以创建一个扩展来执行此操作,但我看不出它有什么用处。由于解释器处理所有内部变量的工作,内存地址在 PHP 脚本中是无用的。在 PHP 之外(比如用 C 或 C++ 操作内存地址)至少可以说是危险的。如果您修改了 PHP 脚本在执行时使用的内存地址,我希望您可能会导致脚本崩溃,并且可能会导致您的解释器崩溃。
但是,如果您正在寻找 PHP 中的内部指针,请查看 references。可能需要阅读一些内容才能理解它们,但如果您需要通过引用传递,请查看它们。快速示例:
<?php
function change( &$name ) { $name = "Yosef"; }
$name = "John";
change( $name );
echo $name;
?>
【讨论】:
正如其他人所说,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 相同,但可能更容易理解。)
【讨论】: