当使用静态工厂模式时,包含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将需要包括在内,即使可能只需要其中一个。据我所知,要求/包括和他们的_一旦变体包含与其调用相同范围的库。这是真的吗?

如果是这样的话,我相信这会导致内存泄漏:

    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;
            }
        }
    }

在我看来,在第二个例子中,对Create()的多次调用会导致多次require,因为调用的范围很大,即使使用了require_once风格。

这是真的吗?在这样的例子中,在php中动态包含库的最佳方式是什么?

谢谢!

自动加载功能通常被视为邪恶,但它能很好地完成这些任务。

如果您能得到一个好的文件系统<->类名映射,这样您就可以在给定要提供的类时找到它,然后它将节省开销,并且只在需要时加载类。

它也适用于静态类,因此一旦静态类在作用域中,它甚至不需要调用require的"is file 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_one被命中,那么类def只会在全局符号表中出现一次。

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