使用静态工厂模式时,包含PHP库的最佳方法是什么?

时间:2008-11-05 21:37:50

标签: php include polymorphism require require-once

我的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 AND 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中包含库的最佳方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:7)

Autoload设施通常被视为邪恶,但它可以很好地完成这些任务。

如果你能得到一个好的文件系统< - > classname mapping,因此,当给定一个要提供的类时,您可以找到它,然后它将节省您的开销,并且只在需要时加载类。

它也适用于静态类,所以一旦静态类在范围内,它甚至不需要调用require的“is yet included yet”测试,因为Class已经在符号表中。

然后你可以创建

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

它会在需要时将它们带入。

有关详细信息,请参阅Php.net/__autoload

答案 1 :(得分:2)

我建议使用autoloader

也就是说,不要使用require_once()来要求任何子类,而是允许自动加载器调用一个函数,该函数可以在您调用new Truck()new Car()时加载引用的类。 / p>

至于内存泄漏问题,不,require_once不受代码块限制。

答案 2 :(得分:1)

答案 3 :(得分:0)

require_once函数的要点是,无论作用域如何,您都不会包含两次文件并重新定义导致PHP错误的类。所以不用担心内存泄漏,如果命中require_once,类def只会在全局符号表中出现一次。

但除此之外,是的,请使用自动加载器。