2011-03-04 51 views
1

这是一个由两部分组成的问题,尽管两部分都是密切相关的。自动加载与工厂和自动加载危险

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

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

回答

6

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

确实如此。如果两个文件中的两个文件名与确切的名称相同,那么您的自动加载器将无法猜测您想要的是哪一个,因此您最终可能会得到错误的类。最简单的解决方法是使用namespaces,这就是他们所做的。

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

这是真的,再次,在某种程度上。自动加载速度比直接加入速度要慢,但要注意的是,它的很多更易于使用,并且您从不包含不需要包含的文件。最后一部分可能会使其成为平局,或者甚至更快。

我认为,对于要保证装饰到每个页面上工作,你必须包括所有的装饰类,所以他的建议是建立一个工厂类,将得到包括创造你想要的类您。

对于PHP本身可以完成的工作,这是一大堆工作。提醒你:如果你在PHP中使用自己编写工厂,以确定要加载的类,你实际上是建立一个自动加载磁带机,但只是没有调用它是什么;)

有什么建议?

我个人不希望手动包含我的文件。我已经开始使用spl_autoload_register功能已经很久了,我不会为此感到遗憾。

1

我认为不使用自动加载器会让事情变得更加困难,并且不利于可读性。

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

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

即你有一个名为My_Special_Model的类。调用自动加载器,它将文件model.php包含在我的/ special目录中。

就性能而言,使用自动加载器时,不要担心,直到您遇到性能问题。您将更有可能能够优化单个查询,而不必删除自动加载。