为什么我(不)使用名称空间的“use”关键字

时间:2013-01-23 07:48:42

标签: php namespaces

我已经使用PHP 5.3一年多了,而且我总是这样做,我不确定是否正确:每当我使用当前上下文命名空间之外的类时,都使用{{ 1}}关键字:

use

所以在代码中我可以直接写:

use Another\Class

没关系,但我经常在我的文件开头有很多$object = new Class(); 指令,维护不太好(如果我不使用这个类,我不太可能删除use指令。

每次我使用这个类时,我也可以编写整个命名空间:

use

所以我想知道两件事:

  • 是否有使用$object = new \Another\Class(); 关键字的缺点(除了每次必须编写整个命名空间的事实),就像你不能做的事情一样?
  • 使用它有什么缺点吗? (它是否会稍微降低性能,因为它以某种方式导入了类)?

修改 只是为了澄清:我知道干净的代码比小的性能调整更重要,我只想知道计算机何时工作,我喜欢感受到的努力: - )

5 个答案:

答案 0 :(得分:6)

使用use的一大缺点是每次都需要输入全名。

使用的一大缺点是可能与已经定义的类发生名称冲突。我不确定PHP如何处理它,但无论哪种方式,你最终都会有一些额外的麻烦。加号是你实际上不必使用相同的名称...但是,减去那就是你有不与文件名对应的类。

在我们进入更多此类性能BS之前,不过:如果您关心别名一个令人讨厌的名称的性能成本,那么您做错了。不要担心“更快”的语法。期。你,你的用户,以及那个强制点击“重新加载”的人用手拿秒表,都不会注意到差异。 永远。有更好的事情需要优化,而且假设你已经达到了你需要的地步。

答案 1 :(得分:4)

我想到的第一件事是使用别名的能力,如:

use My\Full\Classname as Another;

来源php manual

答案 2 :(得分:1)

命名空间不向后兼容PHP< 5.3如果遇到兼容性问题,则必须删除namespaceuse语句的所有情况。

答案 3 :(得分:0)

我使用Eclipse和PDT以及Eclipse完成语法的功能,使用use或complete命名空间,使其变得简单。

就个人而言,我大部分时间都使用“use”(当你使用类名自动完成时Eclipse自动创建),因为在代码上使用了更清晰的语法。

我也使用ClassLoader,我的项目使用的命令与命名空间的顺序相同,所以我的类加载器直接加载每个类。我不需要任何“包含”指令。

我总是使用类(带有fex异常),即使对于普通代码,通常我使用静态代码(没有实例),因为它使Eclipse很容易识别每个类,方法,变量和相关类型。

所以我的代码是很多文件,没有全局变量,并且在类上有分离的模块,所以类名冲突很少见。在这几种情况下,Eclipse可以轻松检测,我使用完整的语法,或缩写(手动,我使用命名空间的别名,所以我使用“namespace_alias \ classname”语法,这是更干净但不做碰撞)。

使用相同结构的命名空间和文件以及以这种方式搜索的类加载器(并在include_path目录中添加所有路径)在大型项目中非常高效。

例如...... \ Example \ Name \ Space \ Myclass搜索为

对于每个listof文件夹(项目的根目录+所有include_path除了“。”)  在开始文件夹上 - >文件夹(示例) - >文件夹(名称) - >文件夹(空格) - >文件(Myclass.inc或Myclass.php或Myclass.php5) ENDFOR

答案 4 :(得分:0)

使用use关键字直到使用该类时才触发该类的导入(自动加载)(根据https://stackoverflow.com/a/35755296/5189780中的回答)

因此,它不会影响性能。

其他参数(例如在php 5.3下运行)与是否使用命名空间的决定更多有关。由于PHP尚未真正提供将类封装在名称空间中的可能性(限制访问),因此使用PHP有助于获得更清晰的代码并解决命名冲突。如果不使用use关键字,就无法真正受益于名称空间。

根据php文档:

  

在PHP世界中,命名空间旨在解决库和应用程序的作者在创建可重用的代码元素(例如类或函数)时遇到的两个问题:

     
      
  1. 您创建的代码与内部PHP类/函数/常量或第三方类/函数/常量之间的名称冲突。   别名(或缩短)Extra_Long_Names的能力旨在缓解第一个问题,从而提高源代码的可读性。

  2.   
  3. 如果您使用的是命名空间,请使用use关键字导入它们,这将使代码更加清晰和井井有条。

  4.