Php 在每页上使用spl_自动加载而不使用关键字?

Php 在每页上使用spl_自动加载而不使用关键字?,php,namespaces,alias,autoload,Php,Namespaces,Alias,Autoload,我们最近一直在使用OO重写PHP应用程序的模型代码。我们已经完成了这些类,并且包含了名称空间(以Project\Level1\Level2或其他形式)。因为这是一个已经构建的应用程序,所以有很多类。我们使用自动加载器,以便于加载类,这非常好。但麻烦就在这里 我们大概有300个页面散布在整个应用程序中,所有这些页面在一开始都需要一个PHP文件(一种引导脚本)。该引导文件中需要自动加载程序脚本 现在,我们的大多数页面将至少使用一个类,但可能会使用许多类。我们知道这里有两种选择: //either c

我们最近一直在使用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;
我们尝试过在引导文件中包含所有类的use关键字,但根据PHP手册,“导入规则是基于每个文件的,这意味着包含的文件不会继承父文件的导入规则。”

似乎在应用程序的每个页面上都包含这些杂乱无章的使用语句会带来更多的麻烦。如果我们在一个页面上使用15个类呢?那么use语句将是巨大的

我的问题是:这是不是太麻烦了?我们使用名称空间是正确的,还是在PHP中没有那么大的帮助?现在知道我们要做什么了,我们做对了吗?我们缺少什么吗?我们应该一直用完全限定名来调用类还是什么


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

在php.ini中,将您的文件添加为前置文件

而使用vanilla Zend Framework Autoloader可能不是您想要的方式,Zend Loader支持自定义自动加载程序,可以尊重在运行时在线或动态指定的名称空间。在您的情况下,您使用的是
use Project\Person\as Person
,这可能会变得很麻烦,正如您已经注意到的那样

在autoloader中使用名称空间将允许您利用使用简单路径遍历的自动加载来组织类,而不必附加大路径来访问感兴趣的部分

因此,您可以保留文件夹结构并使用
新名称空间\人员\地址,而不是
新公司\资产\通用\人员\地址


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

也许您可以研究Zend Framework命名空间类的方式@尼克卡巴莱罗,谢谢你的建议。我们在重写时看了Zend,但决定不遵循他们的确切方法。使用下划线解决方案,它基本上将每个类名转换成一个完全限定的名称,这相当麻烦。但我想他们这样做可能是为了克服PHP的这个愚蠢问题首先,我似乎无法让auto_prepend_file命令在我的.htaccess文件中工作。一直给我一个“内部服务器错误”。也许我在那里做错了什么。第二,你能解释一下你的解决方案对我们有什么帮助吗?因为根据我读到的关于auto_prepend_文件的内容,它只是在每个PHP请求的开头包含一个文件,这对我们的问题仍然没有帮助(因为“导入规则是基于每个文件的”)。如果您有任何进一步的澄清,请让我知道!