我的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只会在全局符号表中出现一次。
但除此之外,是的,使用自动加载器。