Есть ли способ получить доступ ко всем ссылкам на данный объект? - PullRequest
5 голосов
/ 24 мая 2010

у кого-нибудь есть идеи, если и как можно уничтожить / изменить объект php, на который ссылаются во многих местах?unset, очевидно, уничтожает только одну ссылку, и иногда отслеживание всех ссылок вручную невозможно.Есть идеи?Может быть, что-то мне не хватает в Reflection?

Ответы [ 2 ]

6 голосов
/ 24 мая 2010

Нет, но вместо этого вы можете использовать дополнительный уровень косвенности.В настоящее время у вас есть это:

 a    b     c           a    b    (unset)
  \   |    /             \   |
   \  |   /    -->        \  |
    object                 object

Вместо этого вы можете сделать это:

 a    b     c           a    b     c
  \   |    /             \   |    /
   \  |   /    -->        \  |   /
   wrapper                (unset)
      |
      |
   object
3 голосов
/ 09 июня 2010

Хороший ответ, Марк, но я не уверен, как это будет работать:

Первая диаграмма:

<?php

$obj = "foo";
$a = $obj;
$b = $obj;
$c = $obj;

$c = NULL;
unset( $c );
var_dump( $a, $b, $c );

Результаты:

string(3) "foo"
string(3) "foo"
NULL

Вторая диаграмма:

<?php

$obj = "foo";
$wrapper =& $obj;
$a = $wrapper;
$b = $wrapper;
$c = $wrapper;

$c = NULL;
unset( $c );
var_dump( $a, $b, $c );

Результаты:

string(3) "foo"
string(3) "foo"
NULL

Правильный путь:

<?php

$obj = "foo";
$a =& $obj;
$b =& $obj;
$c =& $obj;

$c = NULL;
var_dump( $a, $b, $c );

Результаты:

NULL
NULL
NULL

Пояснение:

Вам нужно сослаться на ваши переменные $ a, $ b, $ c по адресу памяти $ obj, таким образом, когда вы устанавливаете $ c в NULL, это установит фактический адрес памяти в NULL вместо ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...