【问题标题】:The Namespace operator... what's the big deal?命名空间运算符...有什么大不了的?
【发布时间】:2010-10-24 09:31:22
【问题描述】:

谁能向我解释一下使用反斜杠作为命名空间运算符到底有什么不好?我读过很多关于它的嘲笑言论。一位 StackOverflower 甚至说他因此放弃了 PHP。

是的,我知道反斜杠作为字符串中的转义字符具有特殊含义,但它并不比在许多其他语言中使用 -> 或点 . 更糟糕。

这让我想起了任天堂宣布 Wii 名称时的所有嘲笑。每个人都大惊小怪,一旦它出来了,你习惯了,没人在乎,他们继续前进。

所以,请赐教。它有什么不好?你会建议什么?

【问题讨论】:

    标签: php namespaces


    【解决方案1】:

    官方 RFC 和支持文档可以在以下位置找到

    它们包括IRC log about the decision process

    引用部分“问题”

    • \ 看起来很像 / 并且很容易意外翻转,尤其是对于 unix 用户而言
    • \ 用于转义
    • 在字符串中,命名空间名称变为\\like\\this,或者我们会得到奇怪的字符。一开始这可能会让用户感到困惑。
    • 几乎必须重写所有现有的命名空间代码,不可能简单地搜索/替换::
    • 该补丁涉及到很多引擎,需要进行严格的实战测试。
    • 对很多人来说,\this\way 起初看起来很奇怪。

    你提到的任何讥讽言论都可能是出于上述原因或个人意见的“原因”。例如,我发现它们读起来很丑,写起来很麻烦,尤其是在我必须使用双反斜杠的字符串中。但话又说回来,我越经常使用它们就习惯了。

    【讨论】:

      【解决方案2】:

      真正的问题是,他们为什么不把它写成 / ?我个人讨厌 \,因为它是一个转义字符......这对我来说一切都搞砸了!

      【讨论】:

      • / 是除法运算符。 ``如何搞砸一切?
      【解决方案3】:

      让我们假设以下命名空间:

      jp\nintendo\rvl\testing

      你注意到错误了吗?

      实际的(内部)命名空间很可能是这样的:

      jp
      有意
      vl esting

      解决方案是始终使用两个反斜杠作为命名空间分隔符,类似于我们在 Windows 文件名中使用它的方式。

      使用两个反斜杠是完全有害的,因为它本身就是一个转义序列,它扩展为 1 个单字反斜杠,这是实际的命名空间分隔符。

      现在,如果我们使用

      jp\\nintendo\\rvl\\testing
      作为命名空间(使用 2 个反斜杠作为分隔符)实际(内部)命名空间变为:
      jp\nintendo\rvl\testing

      【讨论】:

      • 您的示例命名空间中没有错误。如果那是在双引号字符串中,那么它会有所不同,但事实并非如此。
      【解决方案4】:

      嗯,使用“\”作为命名空间时还有其他问题。

      1. 它是转义字符。如果你 必须使用 \ in "string" 和 \ in '细绳'。感觉有人会乱 在某个时候有了它。迟早的事。 escap char 会抓住你。
      2. '\' 不是很好地位于每个键盘上。在我的键盘上,我必须使用彼此并不接近的组合键,有时这只是一种痛苦。虽然它没有'^'那么糟糕。换句话说,无法流畅地编写需要访问特定键盘映射上的命名空间的代码。
      3. 我记得他们何时投票以及结果多么荒谬。他们之所以选择它,是因为它比其他字符更简单,并且需要更少的输入。老实说,这完全取决于您的键盘布局。

      这就是我能找到为什么使用转义字符可能是一件坏事的全部原因。 老实说,我还在等待能够创建自己的 unicode 符号的语言。因此,它将为您可以覆盖哪个运算符提供更大的灵活性。假设在 c++ 中你可以写类似的东西。

      bool operator ≤ (Dog dog);
      //and then do this
      if(myDog ≤ thisDog){
      }
      //Seems useful?
      bool operator ≅ thisDog){ 
        // this wouldn't check for equality 
        // but for something close to it
      }
      

      能够使用我们自己的任意运算符比使用 + 对事物进行分组更有意义...“∪”会更有意义...如果您想获得交集,只需“∩”然后是人可能会说..“如果我们的字体中没有这些字符怎么办?”我只能回答:“找到有它们的字体!!!!”

      【讨论】:

      • 虽然我同意 在某些情况下比+ 更有意义,但如果没有字符板或广泛的组合键等,输入它就不是一个简单的字符。如果你想形成两个集合的联合输入set1.union(set2); 可能比输入 更快,即使(set1 ∪ set2) 看起来好多了。
      【解决方案5】:

      此外,如果我没有特别好的理由想要一种重新发明语法的语言,我会使用 Ruby。

      【讨论】:

      • 它没有重新发明任何东西,它只是使用了与其他语言不同的字符。
      • 真的吗?最后我检查了 PHP 看起来很像 C++。这就是我选择它的原因,它是一种很好的方式来传递我的编程知识,而不会显着调整我的期望。在这一点上,这是一个糟糕的决定,但它是可以生存的。但是,任何询问过大量 PHP 用户他们想要什么的人都无法得出“\”符合用户想要的结论。事实上,它完全不符合用户的期望,而这正是人们为之疯狂的地方。这一决定似乎没有反映 PHP 编码人员的意见。
      【解决方案6】:

      它的问题在于它在几乎所有其他上下文中都是转义字符。这意味着人们会在不经意间把它弄乱,但它也使它难以阅读,因为你的眼睛习惯于将反斜杠视为元字符,而不仅仅是另一个符号。

      我更喜欢三个冒号,这实际上是在某个时候提出的。

      【讨论】:

      • “所有其他上下文”是指字符串和正则表达式吗?无论是用作运算符(字符串连接)、正则表达式(匹配任何字符)还是字符串(它是句号),句号都有不同的含义。这似乎不会引起任何混乱,那么为什么会 \ ?
      • 我的意思实际上是广义上的。大多数语言使用反斜杠作为转义字符。我认为 \ 与 a 不同。因为它增加了它后面的字符(至少在它用于转义时)。我同意从技术上讲这不是什么大问题,但我的眼睛经过训练可以为该角色赋予特殊含义。
      【解决方案7】:

      有什么不好的地方:你能发现下面代码中的错误吗?

      if(class_exists("namespace1\namespace2\myClass"))
          echo "This will never be true";
      

      我的建议是:不幸的是,'\' 是唯一可用的单个字符。如果 PHP6 是我设计的,我会用关键字替换所有的位运算符(^、&、|、~)(因为它们用得很少)并使用 '|'作为命名空间分隔符。事实上,我会建议进行更多简单的语法更改,以使 PHP 更易于阅读和编写,但改用 Python 会更容易......

      【讨论】:

      • 我发现德语键盘上的“\”键不方便。此外,没有其他语言 (afaik) 使用反斜杠作为 ns-separator 导致另一种做同样事情的方式略有不同。
      • 托比,因为那时 .需要转义。
      • 你不能使用单引号,这样 PHP 就不会解析字符串文字中的任何文本吗?
      • 其他几种语言使用点字符作为命名空间分隔符,尽管它也是它们的主要 OO 分隔符 - 或者换句话说,在不同的上下文中它具有不同的含义。 PHP6 不能使用 -> 或 .并检查上下文?
      • 你不能使用点,因为在这样的语句中: MyNameSpace.MyClass 然后它会寻找两个名为“MyNameSpace”和“MyClass”的常量以字符串附加到彼此(可能会导致一些警告,然后是:“MyNameSpaceMyClass”)。同样,如果你有一个同名的类和命名空间,-> 会导致歧义。
      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      相关资源
      最近更新 更多