Как долго сохраняется переменная экземпляра?В рельсах?На яве?В PHP? - PullRequest
1 голос
/ 20 января 2011

Если я создаю экземпляр класса и задаю переменную экземпляра в модуле Ruby, используемом контроллером или моделью Rails, как долго эта переменная экземпляра сохраняется?Нужно ли явно сохранять переменную в сеансе для сохранения между запросами?

Как Rails сравнивает в этом отношении Java или PHP?

Ответы [ 3 ]

2 голосов
/ 20 января 2011

В PHP это зависит от того, какая версия.Учитывая, что PHP4 был выпущен некоторое время назад, я буду говорить только о 5.2 и 5.3: и да, переменные действительно должны храниться в сеансе или каком-либо другом постоянном механизме (memcached, database, file и т. Д.) Для сохранения в запросах.И самая длинная нативная переменная PHP может длиться - это длина текущего запроса (и конец которого все очищено).

В обеих версиях PHP :

Переменные экземпляра сохраняются до тех пор, пока существуют переменные, ссылающиеся на них.PHP внутренне хранит счетчик ссылок на каждый объект.Когда переменная выходит из области видимости, PHP уменьшает значение refcount и проверяет на 0. Если значение равно 0, оно очищает экземпляр и уничтожает объект.

В PHP 5.0, 5.1 и 5.2:

Переменная очистка наивна.Это означает, что если у вас есть циклическая ссылка (класс A содержит экземпляр класса B, и наоборот), объект никогда не будет очищен, пока не будет освобождена одна из этих ссылок.

В PHP5.3:

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

1 голос
/ 20 января 2011

В Ruby on Rails это всегда зависит от области действия и места его определения.

Например, переменные объектов / экземпляров, определенные в вашей среде и в файлах конфигурации, будут сохраняться всегда. Простым примером этого являются платежные шлюзы ActiveMerchant, которые определены в файле environment.rb и присутствуют для каждого запроса.

В случае контроллеров он представляет только для этого HTTP-запроса объект и переменные экземпляра.

1 голос
/ 20 января 2011

Он существует только в пределах своей сферы. Если он глобальный, он будет существовать столько же, сколько и сеанс. Но если он не является глобальным, он не будет существовать после того, как вы покинете область, в которой он существует.

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