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

Exp*_*lls 1 php autoload spl-autoload-register

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

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

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

Ber*_*rak 6

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

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

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

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

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

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

有什么建议?

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