[英]What is the best way to include PHP libraries when using static factory pattern?
我的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和他們的......一旦變化包括與調用相同范圍的庫。 這是真的?
如果是這樣,我相信這會導致內存泄漏:
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;
}
}
}
在我看來,在第二個例子中,即使使用了require_once風格,多次調用Create()也會因為調用范圍而導致多個需求。
這是真的? 在這樣的示例中,在php中動態包含庫的最佳方法是什么?
謝謝!
Autoload設施通常被視為邪惡,但它很適合這些任務。
如果你可以得到一個好的文件系統< - > classname映射,那么你可以在給定一個提供的類時找到它,那么它將節省你的開銷,只在需要時加載類。
它也適用於靜態類,所以一旦靜態類在范圍內,它甚至不需要調用require的“is yet included yet”測試,因為Class已經在符號表中。
然后你就可以創建了
require("autoloader.php");
$x = new Car();
$x = new Bike();
並且它會在需要時將它們帶入。
有關詳細信息,請參閱Php.net/__autoload 。
我建議使用自動加載器 。
也就是說,不要使用require_once()
來要求任何子類,但允許自動加載器調用一個函數,該函數可以在調用new Truck()
或new Car()
時加載引用的類。
至於內存泄漏問題,不, require_once
不是代碼塊的范圍。
看一下__autoload()函數 。
require_once函數的要點是,無論作用域如何,您都不會包含兩次文件並重新定義導致PHP錯誤的類。 所以不用擔心內存泄漏,如果命中require_once,類def只會在全局符號表中出現一次。
但除此之外,是的,使用自動加載器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.