2011-01-02 6 views
2

ねえ、私は助言が必要です。この小さな機能は私が「良い」と書いたのか、それともリソース豚になるのだろうか?それは、次のように使われています :潜在的なPHPメモリの豚かどうか?

$login = load_class('LoginClass'); 

または

load_class('LoginClassTwo', false); // for singletons and stuff 
$loginTwo = LoginClassTwo::getInstance(); 

は、ここで私はこの方法が効果的でないことを心配し、あまりにも多くのメモリを消費するために起こっている機能

function load_class($class, $instantiate = TRUE){ 

static $obj = array(); // holds the instancec of the classes 

$l = strtolower($class); // the name of the file is the name of the class but lowercased 

if (isSet($obj[$l])) { // Do we have an instance? 

    return $obj[$l]; 
} 

$file = 'classess/' . $l . '.class.php'; 
if (file_exists($file) && is_readable($file)) { // Can we read the file? 

    include $file; 

    if ($instantiate == FALSE) { // Do we need to instantiate? 

     $obj[$l] = TRUE; 
    } else { 

     $obj[$l] = new $class; 
    } 

    return $obj[$l]; 
} 

return FALSE; } 

ですまたは私は間違っていますか?これにはより良い方法がありますか?

答えて

0

私はあなたのコードに何かメモリ豚の種類のものは表示されません..もしあなたがそのようなことを経験しているなら。おそらくロードするクラスです

+0

コード自体が漏洩することはない、そのような可能性がある場合、私は聞いてるのよ;情報について) – Pockata

1

これは、レジストリまたはサービスロケータとして知られている一般的なパターンです。

There は、オブジェクトのグローバルレジストリに問題があります。これらのオブジェクトは、スクリプトが終了するまで再利用されません。それらのオブジェクトの1つがたくさんのメモリを使用する場合は、そこに移動します。しかし、それ自体では、これは問題ではなく、メモリが賢明です。

グローバルに保持するオブジェクトを検討する必要があります。グローバルオブジェクトがプログラムの全体的な複雑さと結合に貢献することは、一般に認められている真実主義です。おそらく、コンストラクタ内のパラメータとしてそれらのいくつかを渡すことはできますか?それはまったくもちろん、ユースケースに依存します。

最後にphpにはautoloadという機能があります。まだ定義されていない場合、ファイルからクラスをロードします。ロジックをレジストリに入れるのではなく、これに接続する必要があります。

+0

感謝。私はクラスインスタンスを保持するために完全なレジストリクラスを作成すると思います。私は今夜​​ここに投稿します。 – Pockata

0

PHPにはクラス用のネイティブの__autoload関数があります。まだ存在しないクラスから新しいオブジェクトを作成しようとすると、いつでも実行されます。この関数は、クラスの名前をクラスファイルとして使用してクラスファイルをインクルードしようとします。これは、多くのプロジェクトがクラスごとに1つのファイルを使用する理由です。この方法では、手動でクラスを再度ロードする必要はなく、クラスが必要な場合を除いてロードされることはありません。次のリンクを参照してください。

http://www.php.net/manual/en/language.oop5.autoload.php

関連する問題