自动加载与工厂和自动加载危险

时间:2011-03-04 07:48:53

标签: php autoload spl-autoload-register

这是一个由两部分组成的问题,尽管这两个部分密切相关。

我为我们的网站创建了一个页面装饰器API,并将装饰器类的自动加载器放在我们的站点范围的包含文件中。另一位开发人员认为这是一个非常糟糕的主意,因为在任何地方使用自动加载器都非常危险并且可能导致奇怪的错误。例如,将对象序列化到会话中,如果其中一个自动加载的类具有相同的名称和__wakeup(),它将被运行(尽管我尝试了这个并且无法重现它)。自动装载是危险的,如果是这样,它有什么潜在的危险以及如何避免?我没有使用__autoload(),而是使用spl_autoload_register()的自动加载功能。

他反对使用自动加载的另一个论点是,它比直接包含文件要慢,这可能很明显。我认为,为了保证装饰器能够在每个页面上工作,你必须包含每个装饰器类,所以他的建议是创建一个工厂类,它将获得包含并为你创建你想要的类。我可以继续,但我听到很多人吹嘘自动加载的优点,并说它使任何应用程序更快。我很喜欢它,但我仍然想做最好和最快的事情。有什么建议吗?

2 个答案:

答案 0 :(得分:6)

  

例如,将对象序列化到会话中,如果其中一个自动加载的类具有相同的名称和__wakeup(),它将被运行(虽然我尝试了这个并且无法重现它)。

在某种程度上,这是真的。如果两个文件中有两个类,其中完全同名,那么您的自动加载器将无法猜出您想要哪一个,因此您最终可能会得到错误的类。对此最简单的解决方法是使用namespaces,这就是它们的用途。

  

他反对使用自动加载的另一个论点是,它比直接包含文件要慢,这可能很明显。

在某种程度上,这也是如此。自动加载比直接包含慢,但请注意, 更容易使用,并且您永远不会包含您不需要包含的文件。最后一部分可能会使它成为平局,或者甚至更快。

  

我认为,为了保证装饰器能够在每个页面上工作,你必须包含每个装饰器类,所以他的建议是创建一个工厂类,它将获得包含并为你创建你想要的类。 / p>

对于PHP可以本地执行的操作,这是一项很多工作。请注意:如果您在PHP中使用自编写的工厂来确定要加载的类,那么您实际上正在构建一个自动加载器,但只是没有调用它;)

  

有什么建议吗?

我个人不想手动包含我的文件。我开始使用spl_autoload_register功能已经很久了,我不会后悔。

答案 1 :(得分:1)

我认为,如果不使用自动加载器,则会使事情变得更加困难,并且会降低可读性。

虽然我还没有真正进入PHP命名空间,但是看看大多数主要框架,PEAR库使用自动加载。

根据类的位置命名一个类,并使用它来加载文件使它变得如此简单。

即。你有一个名为My_Special_Model的类。调用自动装带器并在我的/特殊目录中包含文件model.php。

就使用自动加载器的性能而言,在遇到性能问题之前不要担心。与删除自动加载相比,您更有可能优化单个查询。