Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP 为什么大小写规则是如此不规则? #29

Open
hax opened this issue Oct 15, 2015 · 4 comments
Open

PHP 为什么大小写规则是如此不规则? #29

hax opened this issue Oct 15, 2015 · 4 comments
Labels

Comments

@hax
Copy link
Owner

hax commented Oct 15, 2015

大部分编程语言的符号是 case sensitive 的,少数(如 Basic)是 case insensitive 的。然而 PHP 两种都不是。试验下就会发现,PHP 的函数、方法以及关键字是 case insensitve 的,而变量、常量都是 case sensitive 的。

至于类,你猜是 sensitive 还是 insensitive?

我是占位而已

我是占位而已

我是占位而已

我是占位而已

答案是 insensitive。然而通常我们使用 classloader,如果以大小写不一致的方式使用,则在路径是 case sensitive 的 *nix 环境下,就很容易产生问题了。

我是占位而已

好吧,尽管 PHP 再次体现了奇葩,通常 PHP 程序员并不 care 这个问题,绝大多数人遵循“使用和 manual 一致的大小写”的代码风格。

不过这导致一些很不友善的 API 命名,比如 htmlspecialchars ,为什么不是 html_special_charshtmlSpecialChars

了解函数是 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 的?

大家一起来猜一猜罢 💩

@yyx990803
Copy link

好黑

占位符略碍眼

@Fiery
Copy link

Fiery commented Oct 20, 2015

黑的耀眼!

@hheedat
Copy link

hheedat commented Nov 6, 2015

期待早日补全成文!

@jacksama
Copy link

???

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants