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-указателями.