1

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

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

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

4

2 回答 2

6

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

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

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

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

我认为要保证装饰器在每个页面上工作,您必须包含每个装饰器类,因此他的建议是创建一个工厂类,该类将获取包含并为您创建您想要的类。

对于 PHP 可以在本地完成的事情,这是一大堆工作。请注意:如果您在 PHP 中使用自己编写的工厂来确定要加载哪个类,那么您实际上是在构建一个自动加载器,但只是不这么称呼它;)

有什么建议么?

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

于 2011-03-04T08:17:41.117 回答
1

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

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

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

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

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

于 2011-03-04T08:23:45.933 回答