我应该在PHP中命名全局函数吗


Should I namespace global functions in PHP?

在PHP中,我在类级别使用名称空间。然而,Netbeans也一直告诉我为全局函数命名命名空间。例如,如果我键入

str_replace('stuff');

那么Netbeans将建议将其更改为:

'str_replace('stuff');

这是一个PHP推荐,还是只是Netbeans过于热心?我在PHP文档中找不到任何关于这两种方式的内容。

我看不出它会在代码中引起任何问题。然而,忽视Netbeans却不知道它最初为什么推荐它,这感觉是错误的。但是,在不知道这是正确的事情的情况下改变我的编码实践也不是正确的

中没有此类建议

  • http://php.net/manual/en/language.namespaces.php

也没有必要使用全局标识符,因为当当前命名空间中没有该名称的函数时,PHP将回退到全局函数定义。

话虽如此,添加标识符的唯一原因是让它更明确地表明,当有人将同名函数添加到当前命名空间中时,您希望使用实际的全局内容来防止代码行为的意外更改。

你可能想在Netbeans邮件列表上询问更多关于IDE为什么建议这样做的细节。

当然过于热情了,但我无法复制这是Netbeans 7.0.1,带有PHP插件1.17.1。无论如何,这不是惯例,我根本不认为这是一种最佳做法。

Netbeans根本没有遵循文档中的解析名称空间的规则:

  1. 全局类(如DateTime)需要进行限定,否则,PHP将在当前命名空间中查找该类
  2. 如果当前命名空间中不存在全局函数(如array_filter)和常量,则它们将在全局命名空间中找到(无需显式限定)

换句话说,您的代码应该被视为基于文档化规则的惯用代码。

编译器优化的内部PHP函数是什么?应该通过use语句导入它们吗?

我们是好奇的人,你可能和我一样想知道:他们为什么这么做?函数调用不会自动返回到全局命名空间中吗?是的,从技术上讲,您不需要使用带有全局名称空间分隔符的函数或前缀。

但开源库这样做还有另一个技术原因:少数PHP内部函数具有编译器优化版本,可以避免PHP引擎中内部函数调用的大量内部开销。您可以在PHP的zend_compile.c文件中找到这些函数。