静的なファクトリパターンを使用するときにPHPライブラリを含める最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/266803

質問

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にライブラリを動的に含める最良の方法は何ですか?

ありがとう!

役に立ちましたか?

解決

オートロード機能はしばしば悪と見なされますが、これらのタスクでは非常にうまく機能します。

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

静的クラスでも機能するため、静的クラスがスコープ内にある場合、<!> quot; is file included yet !! quot;を呼び出す必要さえありません。クラスは既にシンボルテーブルにあるため、require onceのテスト。

その後、作成することができます

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

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

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

他のヒント

オートローダーを使用することをお勧めします。

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

メモリリークの質問については、いいえ、require_onceはコードブロックのスコープではありません。

__autoload()関数をご覧ください。

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

ただし、それ以外はオートローダーを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top