用于非本地化目的的Unicode标识符(函数名称)是否可取?

时间:2011-03-18 23:32:14

标签: php unicode identifier

PHP无论如何都允许变量,函数,类和常量的Unicode标识符。它当然是为本地化应用程序。除了英语是值得商榷之外,用任何代码编写API都是个好主意,但是有些开发设置可能需要它,这是无可争议的。

 $Schüssel = new Müsli(T_FRÜCHTE);

但PHP允许标识符不仅仅是\p{L}。您可以使用几乎任何Unicode字符,但ASCII范围除外(例如:是特殊的或\,因为它已经被用作支持命名空间的内部黑客。)
无论如何,你可以这样做,我甚至认为这对于有趣的项目是可行的:

 throw new ಠ_ಠ("told you about the disk space before");

但除了本地化,娱乐和装饰效果之外,建议使用Unicode标识符吗?

例如,我正在考虑将参数嵌入到魔术方法名称中。在我的情况下,我只需要注入数字参数,因此只需使用下划线:

 $what->substr_0_50->ascii("text");
  // (Let's skip the evilness discussion this time. Not quite sure
  // yet if I really want it, but the conciseness might make sense.)

但是如果我想嵌入其他文本参数,我需要另一个unicode字符。现在更难打字,但如果有一个有助于提高可读性并传达意义......?

 ->substr✉0✉50->   // doesn't look good

因此,在这种情况下的问题:哪个符号作为虚函数名称中的混合参数的分隔符是有意义的。 - 更广泛的元主题:你知道哪些使用Unicode标识符,或者你会考虑好吗?

2 个答案:

答案 0 :(得分:21)

为了说清楚:PHP 支持Unicode。它不支持Unicode标签。更准确地说,PHP将LABEL定义为[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。正如您在此处所看到的,除了典型的字母数字+下划线外,它只允许一小部分字符。您的Unicode标签仍然被接受这一事实只是一个事实,即PHP没有Unicode支持。您的特殊字符在UTF-8中长度为几个字节,PHP将这些字节中的每个字节视为一个单独的字符,而意外地 - 将您尝试的字符与每个字符视为\x7f-\xff范围如上所述。

进一步阅读该主题:Exotic names for methods, constants, variables and fields - Bug or Feature?

答案 1 :(得分:4)

  

哪个符号作为虚拟函数名称中的混合参数的分隔符有意义。

\u2639

  

但除了本地化,娱乐和装饰效果之外,建议使用Unicode标识符吗?

字体支持之后的最大障碍是使角色成为可以键入的角色。在宏或复制/粘贴之外,unicode字符不容易进入。强迫这个强加给别人很可能会违反“假设那些与你的代码一起工作的人在你是凶恶的精神病患者之后知道你住在哪里”的规则。

我们在代码库中只使用了几个注释中的unicode字符,比如

// Even though this is the end of the file and we should get an implicit exit, 
// if we don't actually expressly exit here, PHP segfaults.
// ♫ Oh, PHP, I love you. ♫

我认为这属于“娱乐和装饰”类别。或者“在屠杀php-internals团队”类别后“射击自我。选一个。

无论如何,这是一个好主意,因为它会使您的代码难以修改