簡體   English   中英

使用靜態工廠模式時,包含PHP庫的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM