2011-01-20 9 views
1

Railsコントローラまたはモデルで使用されるRubyモジュールでクラスをインスタンス化してインスタンス変数を設定すると、そのインスタンス変数はどのくらい保持されますか?変数間で持続するように変数をセッションに明示的に格納する必要がありますか?インスタンス変数はどれくらい長く保持されますか? Railsで? Javaでは? PHPで?

この点について、RailsとJavaやPHPをどう比較しますか?

答えて

1

Ruby on Railsでは、常にスコープと定義されている場所によって異なります。

たとえば、ご使用の環境と構成ファイルで定義されているオブジェクト/インスタンス変数は、常に存続します。これの簡単な例は、ActiveMerchant支払いゲートウェイです。これは、environment.rbファイルで定義されており、すべての要求に対して存在します。

コントローラの場合、HTTP要求だけでオブジェクトとインスタンス変数が表示されます。

1

これはその範囲内に存在します。それがグローバルであれば、セッションが存在する限り存在します。しかし、それがグローバルではない場合、あなたが存在するスコープを離れると存在しません。

2

PHPでは、バージョンによって異なります。もう少し前にPHP4がリリースされたので、私は5.2と5.3についてのみ説明します:そして、変数をセッションや他の永続的なメカニズム(memcached、データベース、ファイルなど)に格納して、また、ネイティブのPHP変数のうち最も長い時間は、現在のリクエストの長さ(およびその終わりにすべてがクリーンアップされます)です。 PHPの両方のバージョンで

インスタンス変数は限りそれらを参照する変数があるとして存続します。 PHPは各オブジェクトに内部的に参照カウントを格納します。変数が有効範​​囲外になると、PHPはrefcountをデクリメントして0をチェックします。0の場合、インスタンスをクリーンアップしてオブジェクトを破棄します。 PHP 5.0、5.1及び5.2で

可変クリーンアップがnaieveあります。つまり、循環参照がある場合(クラスAはクラスBのインスタンスを保持し、その逆の場合もあります)、それらの参照の1つが解放されない限り、オブジェクトは決してクリーンアップされません。 PHP 5.3で

PHPは、循環参照の正確な理由はなく、インテリジェントガベージコレクタを導入しました。これはオフにすることも、手動でアクティブにすることもできます。ルートカウントが満杯になったとき、またはrefcountが非ゼロの数に減少したときに実行されます。

関連する問題