静的なファクトリパターンを使用するときにPHPライブラリを含める最良の方法は何ですか?
-
06-07-2019 - |
質問
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回だけ入ります。
ただし、それ以外はオートローダーを使用します。