1

问候亲爱的社区,
我正在尝试编写一个类,它通过对每个对象的引用的静态数组在内部跟踪所有实例:

# MyObject.php
class MyObject{
  public static $_register = array();
  public        $_id    = -1;
  public        $_value = '';

  function __construct( $value ){
    $this->_value = $value;
    $this->_id    = count( self::$_register );

    self::$_register[ $this->_id ] =& $this;  // I also tried '= &$this'
  }

  function foo(){                                  // outputs 'id : value'
    echo $this->_id.' : ' . $this->_value . '<br />';
  }
}

但是当我尝试改变$_register我的主脚本时:

#main.php
require_once( 'MyObject.php' );

$test = new MyObject( 'hihi' );
$test->foo();                                     // outputs '0 : hihi'

MyObject::$_register[0] = NULL;

$test->foo();                                     // still outputs '0 : hihi'

它仍然输出'0:hihi'。Avar_dump( MyObject::$_register[0] )表明它设置为 NULL,但应该引用的 MyObject 仍然指向同一个 Instance。

我试图理解 PHP 中的引用,这种行为对我来说是意料之外的。有人可以解释一下吗。

谢谢指教

PS:在我尝试一点 C++/Qt 之前,引用/指针的使用差异让我头晕目眩。

4

1 回答 1

1

那是因为使用 unset 你只会破坏对对象的引用,而不是对象本身。这可能看起来很奇怪,但取消设置引用被视为破坏引用,而不是该引用指向的实体。

然而,在 PHP 中,引用不是指针。PHP参考教程中显示了最大的区别。所以在一般情况下 - 不,您不能取消设置给定引用的实体。请记住:PHP 引用与 C 指针无关。

于 2014-02-11T16:23:58.597 回答