0

codeigniterフレームワークにはこのようなクラスがあります(より明確にするために編集しました。完全な機能はここにありますhttp://pastebin.com/K33amh7r):

function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
    {
        static $_classes = array();

        // Does the class exist?  If so, we're done...
        if (isset($_classes[$class]))
        {
            return $_classes[$class];
        }


        is_loaded($class);

        $_classes[$class] = new $name();
        return $_classes[$class];

    }

したがって、クラスが最初にロードされる(この関数に渡される)ときに、この静的変数に保存されます。次回同じクラスがロードされるときに、この関数はクラスがすでに存在するかどうかをチェックし(静的に割り当てられている場合、キャッシュされている場合、これがメモリにどのように格納されているかわかりません)、存在する場合はロードされます(NOT *インスタンス化*また )

私が見る限り、唯一の目的は時間またはメモリを節約することであり、同じクラスを2回インスタンス化することではありません。

ここでの私の質問は、クラスを実際にインスタンス化すると、メモリを消費したり、読み込み時間を消費したりする可能性があるため、このようにキャッシュする必要があるのでしょうか。

4

3 に答える 3

4

CodeIgniterはラピッドプロトタイピングを対象としており、ほとんどの場合、エンタープライズパターンの良い例ではありません。この動作は、「コントローラー」が他のほとんどすべてのオブジェクトに対して持つ関係の設計上の選択に関連しています。つまり、ほぼすべてのものが1つだけ存在するということです(コントローラーのインスタンスが1つだけ、各ライブラリーのインスタンスが1つだけなど)。この設計上の選択は、迅速な開発に適しています(開発者が「それほど多くを追跡する必要がない」などの理由で正当化されます...)。

基本的に、オブジェクトをインスタンス化しないことで節約されるメモリ(オブジェクトのインスタンス変数を格納するのに必要なメモリと同じ量)があり、オブジェクトのコンストラクターがかなりの作業を行おうとすると、時間も節約できます。

ただし、単一インスタンスの命令の適切性は明らかに普遍的ではありません。時々あなたは本当に新しいインスタンスが欲しいのです。これを正当化できる場合は、より適切なフレームワークを選択してください。

于 2012-08-26T00:44:40.190 に答える
1

クラスのインスタンス化に使用されるリソースと時間は、通常、ごくわずかです。私が通常使用するシングルトンクラスを目にする主な理由は、データの整合性を維持するためです。たとえば、データベース内のデータを表すクラスがある場合、そのクラスに複数のオブジェクトを作成すると、データが同期しなくなる可能性があります。1つのオブジェクトが変更されてDBにデータをコミットする場合、他のオブジェクトには古いデータが含まれている可能性があります。

于 2012-08-26T00:46:06.947 に答える
0

シングルトン パターンを利用するというかなり単純な概念で、アプリケーションの実行サイクル中に 1 つのクラスが 1 回だけインスタンス化されるようにします。

この種の概念は、図書館にも当てはまります。基本的な例を見てみましょう:

class Authenticate {
     public function login($username, $password) {
        ....
     }

     public function logout() {

     }
}

現在、ページの実行を通じて、上記のクラスのオブジェクトを複数回作成する必要がある場合はほとんどありません。理解すべき主なことは、リソースの利用です

はい、同じクラスを何度もインスタンス化すると、間違いなくメモリに追加されますが、私が示した例のように無視できるかもしれませんが、影響はあります。

于 2012-08-26T01:07:21.883 に答える