在每个页面上使用spl_autoload而不使用关键字?

时间:2012-06-04 21:18:30

标签: php namespaces alias autoload

我们最近使用OO重写了我们的PHP应用程序的模型代码。我们完成了类,我们包括了命名空间(以Project \ Level1 \ Level2或其他形式)。由于这是一个已经构建的应用程序,因此有很多类。我们正在使用自动加载器,以便于加载类,这很棒。但这就是麻烦的来源。

我们可能在应用程序中遍布300页,并且所有这些页面在一开始就需要一个PHP文件(一种引导脚本)。该引导程序文件中需要自动加载器脚本。

现在,我们的大多数页面将使用至少一个但可能很多的类。我们知道我们有两种选择:

//either call the classes using qualified names
$person = new Project\Person;

//or include the "use" keyword on every page, so we can alias the classes for ease of use
use Project\Person as Person;
$person = new Person;

但麻烦的是,我们真的不想在我们的应用程序的每一页上都这样做:

require_once('../php/bootstrap.php');
use Project\Person\ as Person,
    Project\Address\ as Address,
    Project\Group\ as Group
    Project\CustomField\ as CustomField;
$person = new Person;
$address = new Address;

我们尝试了,其中包括bootstrap文件中所有类的use关键字,但是根据PHP手册,“导入规则是基于每个文件的,意味着包含的文件不会继承父文件的导入规则。“

似乎在我们的应用程序的每个页面上包含这些庞大的使用语句会产生比它值得更多的麻烦。如果我们在一个页面上使用15个课程怎么办?然后使用声明将是巨大的。

我的问题是:麻烦太麻烦了吗?我们在使用命名空间方面是否正确,或者它在PHP中是否有用?现在知道我们要做什么,我们做得对吗?我们缺少什么?我们应该一直用完全限定的名字来调用类吗?

(这是我关于stackoverflow的第一个问题,所以如果我将来需要做任何不同或更好的问题,请告诉我)

2 个答案:

答案 0 :(得分:1)

虽然使用vanilla Zend Framework Autoloader可能不是您想要的方式,但Zend Loader确实支持自定义自动加载器,它可以在运行时遵循在线或动态指定的命名空间。在您的情况下,您正在使用use Project\Person\ as Person,这可能会变得很麻烦,正如您已经注意到的那样。

使用带有自动加载器的命名空间将允许您利用使用简单路径遍历的自动加载来组织类,而无需为了访问有趣的部分而附加大路径。

因此,您可以保留文件夹结构并使用new Corp_Assets_Generic_Person_Address,而不是new Namespace_Person_Address

命名空间可以避免类名中的冲突。特别是在大型应用程序中实现需要从许多不同库加载正确类的自动加载器。使用较短的类名使代码更易于阅读,但可能使维护更难。添加use语句使得更容易阅读和以后维护,但是编写和重构会很麻烦。记录自动加载器的预期行为并使用自定义自动加载器来制作更易读的类名称将是我的建议。

答案 1 :(得分:0)

在php.ini中将您的文件添加为prepend_file