命名空间运营商......有什么大不了的?

时间:2009-05-07 05:21:59

标签: php namespaces

有人可以向我解释使用反斜杠作为命名空间运算符究竟有什么不好吗?我读了很多关于它的嘲笑言论。一个StackOverflower甚至说因为它而放弃了PHP。

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

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

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

7 个答案:

答案 0 :(得分:12)

它有什么坏处:你能否发现以下代码中的错误?

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

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

答案 1 :(得分:3)

问题在于它几乎是所有其他环境中的转义字符。这意味着人们会无意中弄乱它,但它也使得阅读变得困难,因为你的眼睛被调整为反斜杠作为元字符,而不仅仅是另一个符号。

我更喜欢三个冒号,实际上是在某些时候建议的。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

  1. 这是逃脱角色。如果你 必须在“string”和\ in中使用\ '串'。我觉得有人会搞砸 在它的某个地方。不久之后。 escap char会抓住你。
  2. '\'在每个键盘上的位置都不是很好。在我的键盘上,我必须使用一个非常接近彼此的键组合,有时它只是一个痛苦。虽然它没有'^'那么糟糕。换句话说,不可能在某些键映射上编写需要访问命名空间的流畅代码。
  3. 我记得当他们投票的时候,结果是多么荒谬。他们选择它是因为它比其他字符更简单并且需要更少的输入。说实话,这一切都取决于你的键盘布局。
  4. 这就是我能找到为什么使用转义字符可能是一件坏事的原因。 说实话,我还在等待创建自己的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
    }
    

    能够使用我们自己的任意操作员比使用+来组合事物更有意义......“would”会更有意义......如果你想得到交集只是你“∩”然后人们可能会说..“如果我们的字体中没有这些字符怎么办?”我只能回答:“找一个有它们的字体!!!!”

答案 4 :(得分:1)

官方RFC和支持文档可在

找到

它们包含IRC log about the decision process

引用部分“问题”

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

您提到的任何诽谤言论都可能是由于上述内容或个人意见的“理由”。例如,我发现它们读起来很难看,编写起来很麻烦,特别是在我必须使用双反斜杠的字符串中。但话说回来,我越习惯使用它们。

答案 5 :(得分:0)

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

jp\nintendo\rvl\testing

你注意到错误吗?

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

jp
intendo
vl  esting

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

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

现在,如果我们使用

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

答案 6 :(得分:0)

真正的问题是,他们为什么不把它作为/?我个人很讨厌\因为它是一个逃避角色......这一切都为我解决了一切!