实例变量持续多长时间? 在Rails中? 在Java? 在PHP?

如果我实例化一个类并在Rails控制器或模型使用的Ruby模块中设置实例变量,那么该实例变量会持续多长时间? 是否需要在会话中显式存储变量以在请求之间保留?

Rails如何在这方面与Java或PHP进行比较?

在Ruby on Rails中,它总是取决于范围和定义的位置。

例如,环境和配置文件中定义的对象/实例变量将始终保持不变。 一个简单的例子是ActiveMerchant支付网关,它在environment.rb文件中定义,并且适用于每个请求。

在控制器的情况下,它仅针对该HTTP请求,对象和实例变量。

在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减少到非零数字,它就会运行。

它存在于其范围内。 如果它是全局的,它将在会话中存在。 但如果它不是全局的,那么在你离开它存在的范围之后它就不会存在。