2

我们最近一直在使用 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 个类怎么办?那么使用语句将是巨大的。

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

(这是我在 stackoverflow 上的第一个问题,所以如果我以后需要对我的问题做一些不同或更好的事情,请告诉我)

4

2 回答 2

1

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

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

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

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

于 2012-06-07T03:33:33.530 回答
0

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

于 2012-06-04T21:59:03.450 回答