代码之家  ›  专栏  ›  技术社区  ›  Alex

PHP-如何检查两个引用是否指向相同的底层对象(内存地址)?

  •  0
  • Alex  · 技术社区  · 6 年前

    我来自Java背景,对PHP有点陌生。

    澄清: 我的问题不是关于PHP中==和===之间的差异,也不是关于如何比较PHP中的值。我正在寻找一种方法来查看两个变量是否引用相同的对象/内存地址。相同的对象/内存地址意味着,当我更新变量$a时,$b也需要更新,反之亦然,因为$a和$b引用的是同一事物。

    3 回复  |  直到 6 年前
        1
  •  3
  •   LF-DevJourney    6 年前

    === 仅显示两个变量是否具有相同的类型和值,但无法显示两个变量是否指向相同的地址。

    Php不公开这两个变量是否指向同一地址。

    路1。例如,使用调试信息获取它 var_dump debug_zval_dump() .

    $a ,然后检查 $ b也被修改。

        2
  •  2
  •   Leandro Maro    6 年前

    使用标识运算符(==)时,对象的变量是相同的是,并且仅当它们引用同一类的同一实例时。

        3
  •  0
  •   Martin    5 年前

    serialize 函数可以被滥用来检查两个变量是否相同。

    <?php
    
    // check if two variables are the same reference
    function same(&$a, &$b) {
      // serialize an array containing only the two arguments
      // check if the serialized representation ends with a reference.
      return substr(serialize([&$a, &$b]), -5) === 'R:2;}';
    }
    
    $a = 4;
    $b = &$a;
    $c = 4;
    
    echo "same(\$a, \$b) === " . var_export(same($a, $b), true) . "\n";
    echo "same(\$a, \$c) === " . var_export(same($a, $c), true) . "\n";
    echo "same(\$b, \$c) === " . var_export(same($b, $c), true) . "\n";
    
    // same($a, $b) === true
    // same($a, $c) === false
    // same($b, $c) === false
    
    ?>
    

    • 像_serialize()或_sleep()这样的神奇方法可能会导致副作用。
    • 如果变量是大型对象,性能可能会受到影响。
    • 如果PHP在新版本中更改序列化输出,此函数可能会中断。
    推荐文章