如果我实例化一个类并在Rails控制器或模型使用的Ruby模块中设置一个实例变量,那么该实例变量会持续多长时间?是否需要在会话中显式存储变量以在请求之间保留?
Rails如何在这方面与Java或PHP进行比较?
答案 0 :(得分:2)
在PHP中,它取决于什么版本。考虑到PHP4刚刚出现,我只会谈论5.2和5.3:是的,变量确实需要存储在会话或其他持久机制(memcached,数据库,文件等)中以保持跨请求。并且本机PHP变量可以持续的最长时间是当前请求的长度(以及清除所有内容的结束)。
在两个版本的PHP中:
只要存在引用它们的变量,实例变量就会持续存在。 PHP在内部存储每个对象的引用计数。当变量超出范围时,PHP会减少引用计数并检查0.如果它为0,它将清理实例并销毁该对象。
在PHP 5.0,5.1和5.2中:
变量清理是天真的。这意味着如果你有一个循环引用(A类包含一个B类实例,反之亦然),除非发布其中一个引用,否则永远不会清除该对象。
在PHP 5.3中:
由于循环引用的确切原因,PHP引入了一个相当智能的垃圾收集器。它可以关闭或手动激活。只要其根数已满或refcount减少到非零数字,它就会运行。答案 1 :(得分:1)
它只存在于其范围内。如果它是全局的,它将在会话中存在。但是如果它不是全局的,那么在你离开它存在的范围后它就不会存在。
答案 2 :(得分:1)
在Ruby on Rails中,它总是取决于范围和定义的位置。
例如,环境和配置文件中定义的对象/实例变量将始终保持不变。一个简单的例子是ActiveMerchant支付网关,它在environment.rb文件中定义,并且适用于每个请求。
对于控制器,它仅针对该HTTP请求,对象和实例变量。