【问题标题】:Is there a function like is_reference_of in php?php中是否有类似is_reference_of的函数?
【发布时间】:2011-08-01 23:17:16
【问题描述】:

我希望能够在我的程序中查询变量所引用的变量。有没有办法做到这一点?我查看了所有常见的来源,但找不到任何东西,也许我的搜索词很愚蠢。谢谢。

【问题讨论】:

  • 如果你举个例子会更有帮助回答你的问题
  • 你想知道两个变量是否引用了同一个东西吗?例如,$a = &$b; 表示 is_ref($a, $b) === true?如果是这样,请参阅我的答案。如果不是,那我就误会了。
  • stackoverflow.com/questions/4817562/… 不完全是您想要的,但可能会有所帮助。
  • 这一切都比我想象的要简单得多。我在一个对象中有两个数组,它们包含相同的组合信息,但以完全不同的方式排序和组织,以简化​​一些进一步的功能。我创建了第二个数组作为对第一个变量的引用——我只是想知道我是否可以逆转这个过程并检查一个变量是对哪个变量的引用——明白我的意思吗?

标签: php variables reference


【解决方案1】:

您可以使用 === 运算符比较引用

注意:这只比较对象引用。

$obj1 = new DateTime();
$obj2 = $obj1;

if($obj2 === $obj1){
    echo "Equal";
}else {
    echo "Not Equal";
}
// Outputs Equal


$obj2 = new DateTime();

if($obj2 === $obj1){
   echo "Equal";
}else {
   echo "Not Equal";
}
// Outputs Not Equal

【讨论】:

  • === 是“完全相同的”,不知道也不关心引用。如果被比较的事物具有相同的值,那将是正确的,即使它们实际上是完全不相关的不同变量。它不能帮你找到参考。
  • @Charles in object context === 运算符比较变量是否指向同一个类的同一个实例,因此可以使用它。但检查变量是否属于所需的类实例是另一种情况。
  • 这仅意味着它适用于对象,但不适用于数组、字符串、浮点数、布尔值等。此外,由于对象通过隐式引用工作,它无法区分 $bar = $foo$baz = &$foo... 没有。
  • 是的,没错,我只是认为他需要检查对象引用。我将编辑我的帖子以告知这一点。谢谢。
  • 确实,他还没有告诉我们他需要这个功能的确切用途。
【解决方案2】:

我个人知道的唯一代码是直接查询一个类是什么,而不是检索它:

if($var instanceof Your_Class) { }

如果你知道变量严格来说是一个类,你可以使用:

get_class();

如果您在非对象上使用该函数,它似乎会返回 E_WARNING。我建议这样的代码:

$class_known = false;
if(is_object($class))
{
    $class_name = get_class($class);
    $class_known = false;
}

if($class_known)
{
    echo $class_name;
}

【讨论】:

    【解决方案3】:

    如果您正在处理对象,我相信=== 会执行您想要的测试。

    $obj1 = new Object;
    $obj2 = $obj1;
    
    echo ($obj1 === $obj2) ? 'same' : 'not same'; // same
    
    $obj2 = new Object;
    
    echo ($obj1 === $obj2) ? 'same' : 'not same'; // not same
    

    【讨论】:

      【解决方案4】:

      据我所知,没有直接的方法可以测试两个变量是否指向同一事物。这样的事情可能会奏效:

      function is_reference_of(&$a, &$b)
      {
        // if an object, use strict comparison
        if (is_object($a)) return $a === $b;
      
        // definitely not a reference to each other if they aren't the same value
        if ($a !== $b) return false;
      
        $tmp = $a;
      
        if (is_array($a))
        {
          $a = 0;
          // if $b is no longer an array, then it must be a reference to $a
          $is_ref = !is_array($b);
        }
        else
        {
          $a = !$a;
          // if $b is no longer equal to $tmp, then it must be a reference to $a
          $is_ref = ($b !== $tmp);
        }
      
        // make sure to reset $a back to what it was
        $a = $tmp;
      
        return $is_ref;
      }
      
      $a = 0;
      $b = 0;
      
      is_reference_of($a, $b); // false
      
      $b = &$a;
      
      is_reference_of($a, $b); // true
      

      巨大的免责声明:我并没有仔细考虑过这一点。执行上述操作可能会产生各种副作用。认为这只是一个概念证明,可以帮助您入门

      如果您总是使用数组或类,您可以尝试在其中一个中设置一个临时字段或属性,然后查看它是否存在于另一个中,等等。这样更不容易出错上面的代码改变了整个变量。

      请注意,上述函数中参数的顺序无关紧要。

      更新:对于对象,您可以使用 === 并完全跳过该功能。我稍微更新了函数以检测正在测试的变量类型并做出相应的反应。免责声明仍然适用。

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 1970-01-01
        • 2013-12-11
        • 2011-08-26
        • 1970-01-01
        • 2011-03-27
        • 2013-05-03
        • 2014-06-14
        • 2014-10-06
        相关资源
        最近更新 更多