如何在Zend Framework中使用命名空间?

10

命名空间非常有用,直到最近几个版本,PHP才开始支持它们,据我所知。
当我使用Zend Framework时,我必须记住带下划线的长名称 - 像Zend_Form_Element_ButtonZend_Form_Decorator_HtmlTag等等。
如果我使用命名空间,这可能是可能的,并且更加容易:

namespace Zend {
  class something {
    // ...
  }
}
namespace Zend\Form { class something { // ... } }
namespace Zend\Form\Element { class Button { // ... } }

并且要使用它,我这样做:

use Zend\Form\Element\Button;
$btn1 = new Button();

所以我的问题是,在自动加载器系统和存在于Zend Framework中的许多元类“黑魔法”的情况下,是否可以轻松地重写使用命名空间的代码结构,然后有更合理的类名?
问题不是类名的长度 - Eclipse / Netbeans / Aptana很好处理,而是长名称所引起的烦恼
如果一些你使用的类在名称中有相似的部分,那么经过一段时间会变得混乱
由于ZF是开源的,我认为如果仅通过重命名和一些代码重新组织就能实现命名空间版本的代码,那么Zend不会介意。


你为什么要将这个标记为社区 Wiki? - Bill Karwin
估计出现了重大错误。唉,我也无法撤销社区状态。非常抱歉。我原本以为这对很多人有用,所以进行了编辑等操作。但正如链接的线程所显示的那样,这并不是一件微不足道的事情。 - namespaceform
1个回答

16

不是小事,绝非如此。

Matthew Weier O'Phinney在博客中提到了一些ZF将面临的问题,如果他们重构代码以支持PHP 5.3命名空间:

http://weierophinney.net/matthew/archives/181-Migrating-OOP-Libraries-and-Frameworks-to-PHP-5.3.html

Abstract is a reserved word in PHP. The same goes for interfaces. Consider this particularly aggregious example:

namespace Zend::View

abstract class Abstract implements Interface
{
    // ...
}   

We've got two reserved words there: Abstract and Interface.

Zend框架中有许多名为AbstractInterface的类。为了支持命名空间,他们将不得不进行大量不兼容的重构更改。
此外,由于反斜杠是字符串中的元字符,任何根据类名动态加载类的代码,例如Zend_Db::factory()Zend_Filter_Input,都会变得不必要地困难,因为PHP核心团队做出了一个荒唐的决定,使用反斜杠作为命名空间分隔符。

同意。我一直在想为什么他们要使用反斜杠,当像§、~或某些组合,如//、~~一样的字符也可以很好地完成工作… - Tomáš Fejfar
4
他们声称只能使用普通ASCII中的单个可打印字符,而不会混淆解析器。PHP中的其他字符已经有了其他含义。尽管如此,我认为反斜杠是一个糟糕的选择。在决定使用反斜杠之前,他们应该使用两个(或更多)字符的序列。 - Bill Karwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接