繁体   English   中英

在每个页面上使用不带use关键字的spl_autoload吗?

[英]Using spl_autoload without use keyword on every page?

我们最近一直在使用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手册, “导入规则是基于文件的,这意味着所包含的文件将不会继承父文件的导入规则。”

似乎在我们的应用程序的每一页上包含这些庞大的use语句正在造成比其价值更大的麻烦。 如果我们在一页上使用15个类怎么办? 那么use语句将非常庞大。

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

(这是我关于stackoverflow的第一个问题,所以请让我知道以后是否需要对我的问题做其他更改或更好的操作)

虽然使用香草Zend Framework Autoloader可能不是您想要的方式,但Zend Loader确实支持自定义自动加载器,这些自动加载器可以遵循以行方式指定或在运行时动态指定的名称空间。 就您而言,您已经将use Project\\Person\\ as Person ,这已经很麻烦了,您已经注意到了。

将名称空间与自动加载器一起使用将使您能够利用通过简单路径遍历来自动分类的优势来组织类,而不必为获取有趣的部分而附加大路径。

因此,您可以保留文件夹结构并使用new Namespace_Person_Address来代替new Corp_Assets_Generic_Person_Address

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM