如果我實例化一個類並在Rails控制器或模型使用的Ruby模塊中設置一個實例變量,該實例變量持續多久?變量是否需要顯式存儲在會話中以在請求之間保持不變?實例變量持續多久?在Rails中?在Java中?在PHP中?
Rails在這方面與Java或PHP相比如何?
如果我實例化一個類並在Rails控制器或模型使用的Ruby模塊中設置一個實例變量,該實例變量持續多久?變量是否需要顯式存儲在會話中以在請求之間保持不變?實例變量持續多久?在Rails中?在Java中?在PHP中?
Rails在這方面與Java或PHP相比如何?
在Ruby on Rails中,它總是取決於範圍和定義的位置。
例如,您的環境和配置文件中定義的對象/實例變量將始終保留。一個簡單的例子就是ActiveMerchant支付網關,它是在environment.rb文件中定義的,並且適用於每個請求。
在控制器的情況下,它僅針對該HTTP請求,對象和實例變量。
它存在於其範圍內。如果它是一個全球性的話,只要會議結束就會存在。但是,如果它不是全球性的,那麼在您將範圍留在現有範圍後,它就不會存在。
在PHP中,它取決於什麼版本。考慮到PHP4不久之前,我只會談論5.2和5.3:是的,變量確實需要存儲在會話或其他持久機制(memcached,數據庫,文件等)中以保持跨請求。並且最長的本地PHP變量可以持續的是當前請求的長度(並且其結束部分都被清除)。
在PHP的兩個版本:
實例變量,只要有變量引用它們依然存在。 PHP內部存儲每個對象的引用計數。當一個變量超出範圍時,PHP減少refcount並檢查0。如果它爲0,它會清理實例並銷燬該對象。
在PHP 5.0,5.1和5.2:
可變清理是naieve。這意味着如果你有一個循環引用(A類持有B類的一個實例,反之亦然),該對象將永遠不會被清除,除非這些引用中的一個被釋放。
在PHP 5.3:
PHP引入相當智能的垃圾收集器的循環引用的確切原因。它可以被關閉,或手動激活。只要它的根計數已滿或者計數減少到非零數字,它就會運行。