Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查php中变量的内存位置?_Php - Fatal编程技术网

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

如何检查php中变量的内存位置?,php,Php,如何检查php中变量的内存位置 谢谢对不起,这是不可能的[1] 它们不像C指针;对于 实例,则无法执行指针 使用它们的算术 [1] 如果您需要知道一个变量是否是对另一个变量的引用,那么这是唯一的选择。我很确定这在PHP中是不可能的。您可能可以创建一个扩展来实现这一点,但我看不出它有什么用处。内存地址在PHP脚本中是无用的,因为解释器处理所有内部变量的工作。在PHP之外(比如用C或C++操作内存地址),至少可以说是危险的。如果您在PHP脚本执行时修改了它所使用的内存地址,我预计您可能会使脚本和解释

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


谢谢

对不起,这是不可能的[1]

它们不像C指针;对于 实例,则无法执行指针 使用它们的算术


[1]

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

我很确定这在PHP中是不可能的。您可能可以创建一个扩展来实现这一点,但我看不出它有什么用处。内存地址在PHP脚本中是无用的,因为解释器处理所有内部变量的工作。在PHP之外(比如用C或C++操作内存地址),至少可以说是危险的。如果您在PHP脚本执行时修改了它所使用的内存地址,我预计您可能会使脚本和解释器崩溃。
但是,如果您正在寻找PHP中的内部指针,请查看。你可能需要读几遍才能理解它们,但如果你需要通过引用来传递,请仔细阅读它们。快速示例:

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

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

但是,您可以通过解析var_dump或debug_zval_dump()的输出来提取有关引用的一些信息。请阅读相关手册章节,有关详细信息,请参阅

并准备了Derick Rethans关于PHP中引用的详细信息


在使用debug_zval_dump()时,请注意refcount,因为该函数始终在自身内创建一个附加引用,将该值增加1。要测试一个变量是否引用另一个变量,可以执行以下操作:

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

正如其他人所说,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;
}

(这与相同,但可能更容易理解。)

是的,我需要,例如,如果我想知道变量是其他变量的副本还是指向同一变量的指针,那么当你需要时,你的设计就被破坏了。公平地说,与@Gordon的副本相关,他可能在非传统环境中使用PHP,在这种环境中他必须知道数据的内存地址。他可能没有设计这个系统…也许这可以帮助你=D:这比上更详细的代码(看起来做同样的事情)好吗?谢谢你的文章链接!从未听说过
debug\u zval\u dump()
。非常有趣,谢谢!