方法、常量、变量和字段的奇异名称 - 错误还是功能?

2024-02-07

在评论中出现一些混乱之后

  • PHP 中使用 1 个字母的类名是否安全,例如 A、B、C https://stackoverflow.com/questions/3416551/is-it-safe-to-have-1-letter-class-names-in-php-e-g-a-b-c

我以为我提出了一个问题。根据 PHP 手册,有效的类名应该与[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*。但显然,这不是强制执行的,也不适用于其他任何事情:

define('π', pi());
var_dump(π);

class ␀ {
    private $␀ = TRUE;
    public function ␀()
    {
        return $this->␀;
    }
}

$␀ = new ␀;
var_dump($␀ );
var_dump($␀->␀());

工作正常(即使我的 IDE 无法显示 ␀)。有博学的人可以帮我解答一下吗?我们可以使用任何 Unicode 吗?如果是的话,从什么时候开始?并不是说我实际上会want使用除A-Za-z_但我很好奇。

澄清:我并不需要正则表达式来验证类名,我也不知道 PHP 内部是否使用手册中建议的正则表达式。让我(显然还有相关问题中的其他人)感到困惑的是为什么像这样的事情$☂ = 1完全可以在 PHP 中使用。 PHP6 本来应该是 Unicode 版本,但 PHP6 处于中断状态。但如果没有 Unicode 支持,那我为什么可以这样做呢?


这个问题开始在标题中提到类名,然后继续一个示例,其中包括方法、常量、变量和字段的外来名称。这些实际上有不同的规则。让我们从不区分大小写的开始。

不区分大小写的标识符(类和函数/方法名称)

这里的一般准则是仅使用可打印的 ASCII 字符。原因是这些标识符被标准化为其小写版本,但是,此转换取决于区域设置。考虑以下 PHP 文件,以 ISO-8859-1 编码:

<?php
function func_á() { echo "worked"; }
func_Á();

这个脚本会起作用吗?或许。这取决于什么tolower http://linux.die.net/man/3/tolower(193 http://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout)将返回,这取决于区域设置:



$ LANG=en_US.iso88591 php a.php
worked
$ LANG=en_US.utf8 php a.php

Fatal error: Call to undefined function func_Á() in /home/glopes/a.php on line 3
  

因此,使用非 ASCII 字符并不是一个好主意。然而,即使是 ASCII 字符在某些语言环境中也可能会出现问题。看这次讨论 http://www.mail-archive.com/internals@lists.php.net/msg46122.html。将来可能会通过执行仅适用于 ASCII 字符的独立于语言环境的小写来解决此问题。

总之,如果我们对这些不区分大小写的标识符使用多字节编码,我们就会自找麻烦。这不仅仅是我们不能利用不区分大小写的优势。实际上,我们可能会遇到意外的冲突,因为组成多字节字符的所有字节都使用区域设置规则单独转换为小写。在将区域设置小写规则应用于每个字节后,两个不同的多字节字符可能会映射到相同的修改后的字节流表示形式。

区分大小写的标识符(变量、常量、字段)

这里的问题不太严重,因为这些标识符区分大小写。然而,它们只是被解释为字节流。这意味着如果我们使用 Unicode,我们必须一致地使用相同的字节表示;我们不能混合使用 UTF-8 和 UTF-16;我们也不能使用 BOM。

事实上,我们必须坚持使用UTF-8。在 ASCII 范围之外,UTF-8 使用从 0xc0 到 0xfd 的前导字节,尾随字节在 0x80 到 0xbf 的范围内,这在手册允许的范围内。现在假设我们在 UTF-16BE 编码文件中使用字符“Ġ”。这将转换为 0x01 0x20,因此第二个字节将被解释为空格。

当然,将多字节字符当作单字节字符来读取是根本不支持 Unicode 的。 PHP确实有一些多字节支持,以编译开关“--enable-zend-multibyte”的形式提供(从 PHP 5.4 开始,默认情况下会编译多字节支持,但已禁用;您可以使用以下命令启用它)zend.multibyte=On在 php.ini 中)。这可以让您declare http://php.net/manual/en/control-structures.declare.php脚本的编码:

<?php
declare(encoding='ISO-8859-1');
// code here
?>

它还将处理 BOM,用于自动检测编码并且不会成为输出的一部分。然而,也有一些缺点:

  • 内存和 CPU 的性能均受到影响。它将脚本的表示形式存储在内部多字节编码中,这会占用更多空间(而且它似乎也将原始版本存储在内存中),并且还花费了一些 CPU 来转换编码。
  • 多字节支持通常不会被编译,因此测试较少(更多错误)。
  • 已编译支持的安装与未编译支持的安装之间存在可移植性问题。
  • 仅指解析阶段;没有解决概述了不区分大小写的标识符的问题。

最后,存在缺乏规范化的问题——相同的字符可能用不同的 Unicode 代码点表示(与编码无关)。这可能会导致一些非常难以跟踪的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

方法、常量、变量和字段的奇异名称 - 错误还是功能? 的相关文章

  • 在同一服务器上的 2 个子域中安装 2 个 WordPress 时共享用户

    我有 2 个 WordPress 网站 位于 2 个不同的子域中 例如test1 abc com and test2 abc com 这两个网站都激活了 wp require 插件 只有登录用户才能看到该网站 我们想要创建一个系统 如果用户
  • 显示带有 id 的内部连接的名称[重复]

    这个问题在这里已经有答案了 我有这个查询 select from countrysegments inner join country on countrysegments country id country id inner join
  • WAMP PHP 启动错误:无法加载动态库

    我的 WAMP 服务器昨天工作得非常好 今天我不得不重新启动计算机 但有些事情搞砸了 服务器从未完全启动 任务栏图标保持橙色 我的项目将打开 但仅加载 HTML 而不加载 PHP 这是我的 PHP 错误日志 04 Oct 2014 01 3
  • PHP 可以解压缩使用 .NET GZipStream 类压缩的文件吗?

    我有一个 C 应用程序 它与基于 PHP 的 SOAP Web 服务进行通信以进行更新和许可 我现在正在开发一个反馈系统 供用户通过软件自动提交错误和跟踪日志 根据我之前发布的问题 我认为 Web 服务将是实现此目的的最佳方法 最有可能以最
  • SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)

    我正在寻找一种方法 以不区分大小写的方式对 C 中的 UTF 8 字符串进行比较和排序 以便在SQLite 中的自定义排序规则函数 http www sqlite org c3ref create collation html 该方法应该i
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • PHP:解析器 asp 页面 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 早上好 我可以用 php 解析一个
  • Symfony/Form:函数 DoctrineType::__construct() 的参数太少

    我有一个奇怪的错误 我在自己的系统中实现了 Form 组件 我在那里创建了一个 FormType 其中使用 EntityType 作为字段 每次我想用 formBuilder 创建表单时 它都会抛出以下错误 Fatal error Unca
  • Symfony 4 生产模式错误处理页面内存耗尽

    我将我的项目设置为prod模式在 env除了自定义错误页面之外的所有内容似乎都有效 我将此作为我的 404 树枝模板 templates bundles TwigBundle Exception error404 html twig inc
  • 一次用 \r\n & \n & \r 分解字符串? [复制]

    这个问题在这里已经有答案了 我想按行分割字符串 但我希望它基于所有主要使用的换行符 n r n r 并返回一个包含每一行的数组 您可以使用正则表达式和preg split http php net preg split反而 lines pr
  • 如何下载临时文件

    我正在尝试创建一个简短的 PHP 脚本 该脚本采用 JSON 字符串 将其转换为 CSV 格式 使用fputcsv 并使该 CSV 可作为下载的 csv 文件使用 我的想法是使用tmpfile 不用担心 cronjobs 或磁盘空间不足 但
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • 检查字符串是否编码为 UTF-8

    function seems utf8 str length strlen str for i 0 i lt length i c ord str i if c lt 0x80 n 0 0bbbbbbb elseif c 0xE0 0xC0
  • Symfony VS CakePHP:哪一个最接近 PHP [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我主要是一名 Rails 开发人员 但有时 我必须使用 PHP 进行编码 因为 stackoverflow com更喜欢可以回答的问题 我想知道
  • 从 $i 获取值,顺序被打乱

    for i 0 i lt count name i some output ommited td td
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii
  • 通过 Facebook 图 api 点赞帖子

    你好 我对 facebook PHP SDK 没有什么问题 我想通过 facebook PHP SDK 点赞帖子或其他内容 我正在执行此代码 我认为它应该是正确的 但显然它不起作用 给定的错误代码是的 PHP SDK不知道这种POST请求
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中

随机推荐