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

Unicode identifiers (function names) for non-localization purposes advisable?

提问人:mario 提问时间:3/19/2011 最后编辑:tshepangmario 更新时间:11/1/2014 访问量:2981

问:

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

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

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

 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 标识符的哪些用途,或者您认为可以吗?

PHP Unicode 标识符

评论


答:

22赞 NikiC 3/19/2011 #1

澄清一下:PHP 不支持 Unicode。而且它不支持 Unicode 标签。更准确地说,PHP 将 .正如你在这里看到的,除了典型的字母数字+下划线之外,它只允许一小部分字符。你的Unicode标签仍然被接受的事实只是一个伪影,因为PHP没有Unicode支持。在 UTF-8 中,您的特殊字符有几个字节长,PHP 将这些字节中的每一个都视为一个单独的字符,并且不小心 - 与您尝试的字符一起 - 每个字符都与上述范围匹配。LABEL[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\x7f-\xff

有关该主题的进一步阅读:方法、常量、变量和字段的异国名称 - 错误还是功能?

评论

0赞 mario 3/19/2011
哈哈好吧,PHP5 只是偶然允许他们。字符序列是有效的 UTF8 还是只是一个 L1 字节,这是不清楚的。包括 0x80 字节范围,以便将来兼容。
3赞 tripleee 11/1/2014
UTF-8 将 U+007F 之后的所有字符编码为 0x80-0xFF 范围内的多个字节,这并非“偶然”。
5赞 Charles 3/19/2011 #2

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

\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 团队后向自己的头部开枪”类别。选择一个。

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

评论

0赞 mario 3/19/2011
我想这才是真正的交易破坏者。如果您依赖于自动完成驱动的开发或需要复制粘贴进行扩展,那么相比之下,任何所谓的可读性优势都可能相形见绌。