【问题标题】:Why should i (not) use the "use" keyword for namespaces为什么我应该(不)对命名空间使用“use”关键字
【发布时间】:2013-01-06 15:18:56
【问题描述】:

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

use Another\Class

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

$object = new Class();

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

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

$object = new \Another\Class();

所以我想知道两件事:

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

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

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

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

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

    在我们更深入地讨论这种性能 BS 之前:如果您关心为一个该死的name 起别名的性能成本,那您就错了。不要担心“更快”的语法。时期。你,你的用户,还有那个拿着秒表强迫点击“重新加载”的人,不会注意到差异。 永远。有更好的东西需要优化,这是假设你已经达到了你需要的程度。

    【讨论】:

    • 不管什么东西的成本都没有错。 可能将性能而不是可读性作为目标是错误的。我想知道计算机什么时候做某事。例如,方法调用“成本”,但 cmets 没有。我仍然尽可能避免使用 cmets,但我添加了单行“澄清”方法。我想知道是因为我更了解它是如何工作的,而不是因为我想盲目地(或根本不)提高性能。我已经澄清了我的问题的目的。
    • @Julien 这里的重点是“[没有人] 会......注意到差异[,永远]。”
    • @JanDvorak : 我知道,我不会改变它,这只是为了我的技术文化 :-)
    • @Julien:你提到的性能只是触动了神经。我已经处理过会看这个问题的稻草人,看到提到可能的 0.001% 速度命中,并且就像“OMG use 是如此 sllooowww!”。这些是相同的 idjit,他们会从他们的代码中删除 cmets 和空格,因此 PHP 不会解析那么多。我对那种白痴品牌的容忍度很低,并试图在它开始之前阻止它。拜托,如果你在文化方面学到任何东西,就让它成为菜鸟吧。正确性 > 可维护性 > 其他所有 > 优雅 算法 效率 >>> 句法 效率,IMNSHO。
    • @Sneak:我猜,最终还是要问。但总的来说,在开始时不要有你的工具正在密谋反对你的偏执狂,这样会更有成效。 :) 如果是,那最终会在测量中显示出来。
    【解决方案2】:

    我首先想到的是能够使用别名,例如:

    use My\Full\Classname as Another;
    

    来源php manual

    【讨论】:

    • 采用这种方法可以让您编写更清晰的代码。 “另一个”可能比原来的名称更能解释所用类的用途,因为上下文可能不同。
    【解决方案3】:

    命名空间与 PHP namespace 和 use 语句。

    【讨论】:

    【解决方案4】:

    我使用带有 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) 结束

    【讨论】:

      【解决方案5】:

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

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

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

      根据php文档:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多