9

我已经使用 PHP 5.3 一年多了,我总是做一些我不确定是否正确的事情:每当我使用当前上下文命名空间之外的类时,使用use关键字:

use Another\Class

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

$object = new Class();

这很好,但我经常在我的文件开头有很多use指令,而且维护起来不太好(如果我不使用这个类,我不太可能删除use指令)。

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

$object = new \Another\Class();

所以我想知道两件事:

  • 不使用use关键字有什么缺点(除了你每次都必须编写整个命名空间),比如你不能做的事情?
  • 使用它有什么缺点吗?(因为它以某种方式导入了类,它的性能是否会稍微低一些)?

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

4

5 回答 5

7

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

使用它的一大缺点是可能与已定义的类发生名称冲突。我不确定 PHP 是如何处理这个问题的,但无论哪种方式,您最终都会遇到一些额外的麻烦。优点是您实际上不必使用相同的名称……但是,缺点是您的类与文件名不对应。

不过,在我们甚至更多地了解这种性能 BS 之前: 如果您关心别名的性能成本那您就错了。 不要担心“更快”的语法。时期。您、您的用户以及手持秒表强迫点击“重新加载”的那个人不会注意到差异。 曾经。 有更好的东西需要优化,这是假设你已经达到了你需要的程度。

于 2013-01-23T08:01:53.860 回答
4

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

use My\Full\Classname as Another;

源码php手册

于 2013-01-23T08:01:33.770 回答
1

命名空间与 PHP < 5.3 不向后兼容,如果遇到兼容性问题,则必须删除所有 casenamespace和语句。use

于 2013-01-23T08:03:47.743 回答
0

我使用带有 PDT 的 Eclipse 和 Eclipse 完成语法的能力,无论是使用 use 还是使用完整的命名空间,都使它变得容易。

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

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

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

所以我的代码是很多文件,没有全局变量,并且类上的模块分开,所以类名冲突很少见。在这少数情况下,Eclipse 很容易检测到哪里,我使用完整的语法或缩写(手动,我使用命名空间的别名,所以我使用“namespace_alias\classname”语法,这样更简洁但不碰撞)。

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

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

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

于 2014-06-27T06:58:43.267 回答
0

在使用use关键字之前,关键字的使用不会触发类的导入(自动加载)(根据https://stackoverflow.com/a/35755296/5189780中的回答)

因此,它不应该影响性能。

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

根据php文档:

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

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

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

于 2018-08-13T19:37:05.083 回答