java学习基地

微信扫一扫 分享朋友圈

已有 1376 人浏览分享

PHP黑系列之一:PHP 为什么大小写规则是如此不规则?

[复制链接]
1376 0

年夜部门编扯蒿行的标记是 case sensitive 的,少数(如 Basic)是 case insensitive 的。但是 PHP 两种皆没有是。实验下便会发明,PHP 的函数、办法和枢纽琢壳 case insensitve 的,而变量、常量皆是 case sensitive 的。

v2-ec9dea9e366386fb459857aa1d27ef7d_1440w.jpg

至于类,您猜是 sensitive 仍是 insensitive?


仓位下!


仓位下!


仓位下!


谜底是 insensitive。但是凡是我们利用 classloader,假如以巨细写纷歧致的方法利用,则正在途径是 case sensitive 的 *nix 情况下,便很简单发生成绩了。

好吧,虽然 PHP 再次表现了偶葩,凡是 PHP 法式员其实不 care 那个成绩,尽年夜大都妊篷循“利用战 manual 分歧的巨细写”的代码气势派头。
不外那招致一些很没有和睦的 API 定名,好比 htmlspecialchars ,为何没有是 html_special_chars 或 htmlSpecialChars?
理解函数是 case insensitive 后,我们明白究竟上后者的写法是可止的。实践上最后那个函数(正在 PHP2 的文档中)便是以 CamelCase 方法定名的(HtmlSpecialChars)。但没有知是出于甚么缘故原由,(大概是出于“同一”巨细写气势派头?)PHP3 开端,文档中一切函数局部小写了。


可是最后为何函数被设想为 case insensitive?
PHP 之女 Rasmus 正在一个访道中道:“...I then wrote a very simple parser that would pick tags out of HTML files and replace them with the output of the corresponding functions in the C library... The simple parser slowly grew to include conditional tags, then loop tags, functions, etc. At no point did I think I was writing a scripting language. I was simply adding a little bit of functionality to the macro replacement parser. I was still writing all my real business logic in C.”

那里流露出很多疑息。实在最后的 PHP 或许比明天更靠近一个模板引擎!晚期 PHP 便是“宏交换(macro replacement)”,而营业逻辑并非它的职责。宏交换详细来讲是将 HTML 中的钠舂 tag 交换为 C 写的洞喀函数的输出。以是爆栈的┞封个答复里道,由于 HTML tag 是 case insensitive 的,以是正在查找洞喀函数时,便根据 case insensitive 的方法了。厥后的 PHP 固然曾经变得完整差别,但函数名便不断 case insensitive 了。

那一缘故原由很有多是本相。实践上不只函数,那些晚期便有的构造,好比 if / for 之类的枢纽字,另有 echo、list 之类并不是是函数的特别指令,也皆是 case insensitive 的。大概我们该当反过去问,为什么正在言语年夜部门元素皆是 case insensitive 的状况下,变量名倒是 case sensitive 的?


上面我们会商下 class 。class 的属性战常量是 case sensitive 的,办法是 case insensitive 的。如许战一般变量、常量、函数的巨细写状况恰好是分歧的。(唔!分歧性?!)
成绩是类名自己为何是 insensitive?(从曲觉上,类名岂非没有史狳靠近常量?)


想想?


想想?


想想?


上面发表谜底:

由于 PHP 类一开端其机关器并不是如今的 __construct,而是战类同名的办法。由于办法是 insensitive,以是类名也便是 insensitive 的。(唔!分歧性?!)


好了,我念如今您能够很骄傲的道,本人终究弄分明 PHP 中各类巨细写划定规矩了!但是且缓!
PHP 有 goto 语句!能够跳转到指定的 label。goto 做为枢纽字,我们能够必定它是 case insensitive 的。但是 label 是 sensitive or insensitive 的?

各人一同去仓位猜罢 ?


【补遗:2年前本文里实在另有一面漏掉,文中提到的 PHP 里的各类机关,此中有一种,实践是又可 case sensitive 又可 case insensitive 的。凶猛没有?猜猜是哪种?】

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-4-17 06:40 , Processed in 0.532193 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.