我的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中包含库的最佳方法是什么?
谢谢!
答案 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只会在全局符号表中出现一次。
但除此之外,是的,请使用自动加载器。