是的,我知道反斜杠在字符串内部具有转义字符的特殊含义,但它并不比在许多其他语言中使用箭头 "->" 或点 "." 更糟糕。
这有点让我想起了任天堂宣布 Wii 名称时所有的嘲笑。每个人都大惊小怪,然后一旦习惯了,就没人关心了,他们继续前进。
那么,请启迪我。它有什么问题?你会建议使用什么代替?
为什么这样不好:你能在下面的代码中发现错误吗?
if(class_exists("namespace1\namespace2\myClass"))
echo "This will never be true";
我会建议什么:不幸的是,'\'是唯一可用的单个字符。如果PHP6由我设计,我会用关键字代替所有的位运算符(^,&,|,~),并使用“|”作为命名空间分隔符(因为它们很少被使用)。实际上,我会建议更多简单的语法改变来使PHP更易于阅读和编写,但最好还是使用Python代替...
它的问题在于几乎在任何其他上下文中都是转义字符。这意味着人们会无意中搞砸它,但也使得它难以阅读,因为你的眼睛已经调整为将反斜杠读作元字符,而不仅仅是另一个符号。
我更喜欢三个冒号,这实际上曾经被建议过。
在使用反斜杠作为命名空间时,还存在其他问题。
这就是我发现可能使用转义字符是一个坏事的所有原因了。 说实话,我还在等待一种能够创建自己的 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)
看起来更漂亮。 - dreamlax官方RFC和支持文件可以在以下链接找到:
它们包括有关决策过程的IRC日志。
引用第"问题"部分
\
看起来很像 /
,对于 Unix 用户来说很容易不小心翻转。\
用于转义。\\like\\this
或者我们可能会得到奇怪的字符。这可能会让用户感到困惑。::
是不可能的。\this\way
一开始看起来很奇怪。你提到的任何嘲笑的言论都可能是由于上述原因或个人观点造成的。例如,我发现它们阅读起来很丑陋,写起来很麻烦,特别是在字符串中我必须使用双反斜杠。但是,随着我使用它们的次数越来越多,我会逐渐习惯它们。
假设以下命名空间:
jp\nintendo\rvl\testing
你注意到错误了吗?
实际(内部)命名空间很可能像这样:
jp intendo vl esting
解决方法是始终使用两个反斜杠作为命名空间分隔符,类似于在Windows文件名中的使用方式。
使用两个反斜杠完全是无害的,因为它本身就是一个转义序列,它会扩展为一个单独的字面反斜杠,这是实际的命名空间分隔符。
现在,如果我们使用
jp\\nintendo\\rvl\\testing作为命名空间(使用2个反斜线作为分隔符),实际(内部)命名空间变成:
jp\nintendo\rvl\testing