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

时间:2009-11-07 02:42:21

标签: zend-framework namespaces

命名空间非常有用,在最近几个版本AFAIK发布之前,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会介意代码的命名空间版本,如果只是重命名和一些代码的重新组织可以实现

1 个答案:

答案 0 :(得分: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是PHP中的保留字。   接口也是如此。考虑   这个特别重要的例子:

namespace Zend::View

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

我们在那里有两个保留字:AbstractInterface

Zend Framework中包含名为AbstractInterface的类。他们将不得不进行大量向后不兼容的重构更改,以使ZF代码支持名称空间。

此外,由于反斜杠是字符串中的元字符,因此任何基于类名动态加载类的代码(例如Zend_Db::factory()Zend_Filter_Input)都不必要地难以实现,因为这是一个难以理解的决策PHP核心团队使用反斜杠作为命名空间分隔符。