PHP和大小写敏感性问题

59

在PHP中,变量和常量名称区分大小写,而函数名称则不区分大小写。

据我所知,PHP是唯一出现这种情况的语言。我使用过的所有其他语言要么完全区分大小写,要么完全不区分大小写。

为什么PHP 部分地区分大小写呢?

请注意,我不是在问哪些名称区分大小写,而是在问为什么

更新

我想为那些认为我在问哪些名称区分大小写的人增加以下列表:

区分大小写

  • 字符串
  • 变量
  • 对象属性
  • 常量,默认情况下

不区分大小写

  • 关键字等
  • 函数
  • 对象方法
  • 常量,如果相应定义了
  • 类名

注意:

  • 因此,类是一个混合包:
    • class关键字不区分大小写
    • 类名在声明、实例化和静态调用时不区分大小写
    • 作为函数的类方法不区分大小写
    • 作为变量和常量的类属性区分大小写
  • 因为字符串区分大小写,所以任何依赖于字符串的东西,例如数组键和值,也都是区分大小写的

4
我不知道为什么,也许是他们以那种方式设计了这门语言。但是将 PHP 视为区分大小写的,并按照声明使用函数/变量,这是一个好习惯。 - aagjalpankaj
注意到编辑并访问问题,我想知道为什么它仍被视为未解决?编辑:我认为这可能被认为是太宽泛了。可能只有PHP.net的人才能完全或接近地回答这个问题。 - Funk Forty Niner
5
我想补充说明的是,命名空间也是不区分大小写的。 - Alexandru
值得注意的是,类型提示不区分大小写。对于类来说,这并不令人惊讶,但它也适用于像布尔值这样的原始类型。幸运的是,这些被禁止用作类名,因此不会发生冲突。 - Arno Hilke
3个回答

38

FYK (更新)


大小写敏感(包括用户自定义和PHP定义)

  • 变量
  • 常量 ->>查看修正1
  • 数组键
  • 类属性
  • 类常量

大小写不敏感(包括用户自定义和PHP定义)

  • 函数
  • 类构造函数
  • 类方法
  • 关键字和结构(if,else,null,foreach,echo等)

php.net

基础知识

在PHP中,变量由美元符号后跟变量名表示。变量名称区分大小写。

变量名称遵循PHP中其他标签的规则。有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。作为正则表达式,它将被表达为:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'


修正

  1. 类常量始终区分大小写。使用const声明的全局常量始终区分大小写。应注意,这仅适用于常量的短名称,而PHP中的命名空间始终不区分大小写。使用define()声明的常量默认区分大小写。

一些有用的链接

  1. 用户定义的命名规范
  2. 为什么PHP中的函数和方法不区分大小写?
  • PHP函数是否区分大小写?
  • PHP关键字是否区分大小写?
  • PHP函数名是否区分大小写?
  • PHP区分大小写的来源

  • 6
    很抱歉,但我必须评论一下,这并没有回答问题。我没有问如何创建变量,或者哪些名称是区分大小写的。我问的是为什么。 - Manngo
    2
    我想知道为什么总有人会迅速复制粘贴一些手册的部分,而实际上并没有完整地阅读整个原帖... :-\ 这根本不是一个答案!我的回答是,这只是因为 PHP 是由更多的开发人员制作的,他们没有很好地沟通,因此导致了这种困惑的混乱。我的问题是如何禁用这种奇怪的行为?对于变量名称的大小写敏感性,我认为这只是各种难以找到的错误和漏洞的巨大机会,这种方法没有其他价值,抱歉... - McVitas
    2
    请注意,TRUE和FALSE也是不区分大小写的,因为它们也是语言结构而不是技术意义上的常量,因为多个值可以等于它们。例如,1==TRUE"xyz"==TRUE等。 - Codesmith
    我可以问一下为什么你保护了这个问题吗? - Manngo
    @AbdullaNilam 已经阅读了。特别是,“问题通常受到保护,因为它们吸引了垃圾答案或“嘈杂”的答案,例如“谢谢”,“这对我有用”,或者新用户可能会将该网站误认为是传统论坛的“我也遇到了这个问题”。 ”部分。唯一的问题不在于这种类型的回应,而是忽略问题的答案。 - Manngo
    @AbdullaNilam 抱歉,这也包括了你的回答。请看我对你回答的第一条评论。 - Manngo

    25
    为什么PHP是部分大小写敏感的?
    我只能推测这源自非常早期的版本,可能是PHP/FI 2.0。该手册明确说明:
    “请记住,PHP/FI函数名称不区分大小写。”
    大多数用户输入,例如GET和POST参数,一直被注册为全局变量,当时就是这样。将它们视为不区分大小写可能会导致问题,因此所有变量都被视为区分大小写。
    据我所知,这些已经是PHP/FI 2.0中唯一的标识符类型。所有其他标识符似乎是后来引入的,并且显然是模仿不区分大小写的函数名称。
    常量是特殊的,只在PHP 4中引入(PHP 3手册提到了“常量”,但现今被称为“字面值”)。由于某种神秘的原因(也许找不到共识),决定允许常量标识符在开发者的判断下区分大小写或不区分大小写的方式进行define()。有趣的是,虽然define()默认为区分大小写的常量,但其相应的C语言对应函数(REGISTER_*_CONSTANT)默认为不区分大小写。

    你知道吗,我从来没有注意到define函数上的额外可选参数。 - Manngo
    1
    我接受这个答案,因为似乎真的没有一个好的理由。它似乎是混合遗产的遗留问题。 - Manngo

    -1

    区分大小写

    变量、常量、数组键、类属性、类常量

    不区分大小写

    函数、类构造函数、类方法、关键字和结构体(if、else、null、foreach、echo等)


    13
    是的,但是为什么? - Manngo

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接