评估PHP名称空间


11

我现在处于开源PHP项目的预发布阶段,我希望其他开发人员可以在自己的项目中使用该项目。该项目当前不支持名称空间,我正在尝试评估它是否应该使用名称空间或Dir_Subdir_Class的PEAR命名约定,这似乎具有所有相同的技术优点,而没有一些缺点。老实说,这不是一个容易的选择。

关于名称空间的一些注意事项:

  • 我的项目试图通过提供比其他类似项目更简单的API来与众不同的方式之一。因为名称空间是新的,而且因为它们比PEAR命名约定更复杂,所以将它们引入代码库会使我的项目使用起来不那么简单。通过实施它们,我在易用性方面失去了一些差异。
  • 虽然我看到了命名空间的一些好处,但它们似乎并没有解决使用PEAR命名约定的现代PHP产品中需要解决的问题。使用项目时,如果不存在命名冲突,则应尽量减少。
  • 文章给了我在采用的命名空间及其实施已不到恒星一些暂停。
  • 我也很犹豫,跳上一个可能永远不会走的潮流。由于名称空间是PHP的新功能,因此我还不确定它们将成为标准的。
  • 兼容性。几乎所有以前写过的PHP代码都不使用名称空间,因为它是一项新功能。如果不进行转换,其他库将不兼容。

使用名称空间的一些要点:

  • 知觉。如果名称空间成为标准和最佳实践,那么没有它们,我的项目很快就会被视为不专业且过时的项目。
  • 竞争。尽管一些竞争的PHP项目开始在其最新版本中使用名称空间,但许多项目尚未实现飞跃。现在这样做可以使我的项目在其他项目上有优势。
  • 如果我现在在项目公开之前而不是之后进行转换,那以后的工作会更容易,因为我不得不暂时支持它的两个版本。
  • 我想支持最佳实践,如果名称空间成为PHP的最佳实践,则我的项目应使用它们。

据我所知,您必须选择一种方法。你不能两者都做。有没有我没有考虑的观点?是否有任何客观的迹象(请不要烈火)指向或反对命名空间成为PHP的专业标准?我将不胜感激,您愿意分享任何见解或资源,因为我需要尽快做出决定。

Answers:


5

有两个迹象表明PHP中的命名空间将继续存在:

  1. 放弃了PEAR命名方案,转而使用PEAR2中的名称空间。
  2. Zend Framework 2.0的既定目标之一是通过充分利用名称空间等方法,成为PHP 5.3使用的典范。我认为这充分表明Zend完全致力于命名空间,并将继续支持和发展它们(希望更好)。

我完全同意您的看法,至少可以说,缺少名称空间的当前实现,但是您反对使用它们的论点并不是那么可靠。即使以当前形式,名称空间也可以提供:

  • 更好的代码组织,
  • 避免命名冲突,
  • 类,函数和常量的上下文。

请记住,大多数针对PHP名称空间的争论是通过与其他语言的实现进行比较,而不是针对其功能的实际优点。


+1的链接。您可以扩展更好的代码组织和上下文点吗?我很难理解它如何提供更好的代码组织。似乎大多数项目将对逻辑目录中的文件结构坚持1:1类,与在PEAR命名方案中使用的相同。在大多数情况下,甚至ZF2看起来都在使用相同的目录和文件结构,但现在只是使用名称空间。这是不同的,但是我不一定要首先看到比命名目录和文件更好或更组织化的东西。
VirtuosiMedia

我在上下文方面也遇到了麻烦。如果有的话,似乎名称空间会删除上下文,使其具有更简洁的编码样式,而不是添加上下文。举例来说,如果我在文件中实例化一个新类,则现在需要查找声明名称空间的位置以弄清楚它是哪个类,而不是从类名中立即看到它。除非我丢失了某些内容,否则似乎名称空间不那么冗长,但却以清晰度为代价。
VirtuosiMedia

@VirtuosiMedia的PEAR和老ZF命名方案效仿的命名空间,所以我的三点是有点真对他们来说太。我要指出的是,如果这些要点在当前的PHP名称空间实现中是正确的,则它们的小缺点并不足以不使用它们。有了更好的代码组织,我的意思主要是跨文件,为您的类采用合理的逻辑结构和层次结构,这在没有名称空间的情况下当然是可行的。但是名称空间(以及模拟它们的方案)是一项功能,可以帮助您一次实现所有这三个方面。
yannis 2011年

知道了 感谢您的澄清。您是否看到实际名称空间比仿真名称空间具有明显优势?
VirtuosiMedia

1
@VirtuosiMedia使用问题中使用的命名空间的所有要点都是有效的。除此之外,我还要补充一点,PHP名称空间可以使您的代码对于来自不同背景的编码人员来说更加自然,这在大型项目中可能是无价之宝。此外,还没有用于模拟名称空间的标准,请确保它们中的大多数都差不多,但是使用实际名称空间可确保每个人都使用相同的架构。顺便说一句,那里有一个命名空间,您可以用来命名代码。
yannis 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.