7

私の PHP ライブラリには、いくつかの静的ファクトリ パターンがあります。ただし、メモリ フットプリントが手に負えなくなってきており、実行時に必要なファイルの数を減らしたいと考えています。以下は、現在の状況の例です。

require_once('Car.php');
require_once('Truck.php');

abstract class Auto
{
    // ... some stuff ...

    public static function Create($type)
    {
        switch ($type) {
            case 'Truck':
                return new Truck();
                break;
            case 'Car':
            default:
                return new Car();
                break;
        }
    }
}

Car.php と Truck.php のどちらか一方のみが必要な場合でも、含める必要があるため、これは望ましくありません。私の知る限り、require/include とその ..._once バリエーションには、呼び出しと同じスコープのライブラリが含まれています。これは本当ですか?

もしそうなら、これはメモリリークにつながると思います:

    abstract class Auto
    {
        // ... some stuff ...

        public static function Create($type)
        {
            switch ($type) {
                case 'Truck':
                    require_once('Truck.php');
                    return new Truck();
                    break;
                case 'Car':
                default:
                    require_once('Car.php');
                    return new Car();
                    break;
            }
        }
    }

2 番目の例では、require_once フレーバーが使用されていても、呼び出しのスコープのために、Create() への複数の呼び出しが複数の require につながるように見えます。

これは本当ですか?これらの例でライブラリをphpに動的に含める最良の方法は何ですか?

ありがとう!

4

4 に答える 4

7

Autoload 機能は悪と見なされることがよくありますが、これらのタスクでは非常にうまく機能します。

提供するクラスが与えられたときにそれを見つけることができるように、適切なファイルシステム <-> クラス名マッピングを取得できれば、オーバーヘッドを節約し、必要なときにのみクラスをロードできます。

静的クラスでも機能するため、静的クラスがスコープに入ると、クラスが既にシンボルテーブルにあるため、require の「ファイルはまだ含まれていますか」テストを 1 回呼び出す必要さえありません。

次に、作成するだけです

require("autoloader.php"); 
$x = new Car();  
$x = new Bike(); 

必要なときにそれらを取り込むだけです。

詳細については、 Php.net/__autoloadを参照してください。

于 2008-11-05T21:42:46.990 に答える
2

オートローダーの使用をお勧めします。

つまり、 を使用していずれかのサブクラスを要求するのではなく、またはrequire_once()を呼び出したときに、参照されたクラスをロードできる関数をオートローダーが呼び出すことができるようにします。new Truck()new Car()

メモリ リークの質問については、いいえ、require_onceコード ブロックの対象外です。

于 2008-11-05T21:44:18.373 に答える
1

__autoload() 関数を見てください。

于 2008-11-05T21:43:56.127 に答える
0

require_once 関数の要点は、スコープに関係なく、ファイルを 2 回インクルードして、PHP エラーを引き起こすクラスを再定義しないことです。そのため、メモリ リークの心配はありません。require_once がヒットした場合、クラス定義はグローバル シンボル テーブルに 1 回だけ入ります。

しかし、それとは別に、オートローダーを使用してください。

于 2008-11-05T22:11:03.407 に答える