PHP - класс внутреннего статического реестра (&$this) не работает

Приветствую уважаемое Сообщество,
Я пытаюсь написать класс, который отслеживает все экземпляры внутри через статический массив ссылок на каждый объект:

# 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: хихи". var_dump( MyObject::$_register[0] ) показал, что он установлен в NULL, но MyObject, на который следует ссылаться, все еще указывает на тот же экземпляр.

Я пытаюсь понять ссылки в PHP, и это поведение было неожиданным для меня. Может кто-нибудь, пожалуйста, объясните это.

Спасибо за совет

PS: прежде чем я попробовал немного C++/Qt, и разница в использовании ссылок / указателей вызывает у меня головокружение.

1 ответ

Это потому, что с помощью unset вы уничтожаете только ссылку на объект, но не сам объект. Это может показаться странным, но неустановленная ссылка считается уничтожающей ссылкой, а не объектом, на который указывает эта ссылка.

Однако в PHP ссылка НЕ является указателем. Большая разница показана в учебнике по ссылкам на PHP. Так что в общем случае - нет, вы не можете сбросить сущность с заданной ссылкой на нее. Помните: ссылки на PHP не имеют ничего общего с C-указателями.

Другие вопросы по тегам