Глобалы, объекты и ссылки в php - как они работают? - PullRequest
0 голосов
/ 07 февраля 2012

Я понимаю, что с помощью "=" объекты назначаются по ссылке и для других переменных, а также для типов данных, таких как строки и целые числа, вам необходимо использовать "= &" для назначения по ссылке. Когда вы назначаете объект по ссылке, явно используя "= &", это, похоже, не влияет на назначение. Однако, когда вы назначаете объект глобальному объекту, он делает.

Обратите внимание на следующее:

<?php

$global_obj = null;

class my_class {

    var $value;

    public function __construct() {
        global $global_obj;

        $global_obj =& $this;
        $GLOBALS['some_var'] = $this;
    }
}

$a = new my_class();
$a->my_value = 5;
$global_obj->my_value = 10;

echo 'A: ' . $a->my_value; //5
echo '<br />';
echo 'Global Object: ' . $global_obj->my_value; //10
echo '<br />';
echo 'Globals Array Value: ' . $some_var->my_value; //5

?>

Если вы удалите амперсанд в коде выше $, это будет присвоено $ global_obj по ссылке. Мой вопрос , почему наличие амперсанда там, по-видимому, мешает этому произойти ?

Спасибо

1 Ответ

2 голосов
/ 07 февраля 2012

Здесь происходит то, что $global_obj является ссылкой на переменную $this. $this - это псевдопеременная, которая существует внутри методов и является ссылкой на текущий объект. Но кто знает, что происходит с $this, когда оно выходит за рамки метода. Вероятно, плохая идея иметь ссылку на $this.

На самом деле, если вы исследуете его немного дальше, после того, как ваш конструктор вернется, если вы изучите $global_obj, его значение будет null. Механизм PHP, вероятно, устанавливает $this в null после выхода из метода (но это нигде не задокументировано), и после него следует ваш $global_obj, поскольку он является ссылкой на переменную $this. Когда вы устанавливаете атрибут на null, он автоматически создает новый объект класса stdClass, поэтому кажется, что он успешен. Но, конечно, это совершенно другой объект, чем тот, что в $a.

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