PHP的问题:全面阐述PHP网站设计的问题(2)
PHP
语言核心
CPAN被称为“Perl的标准库”。这并没有对Perl的标准库做过多说明,但它蕴含了健壮的核心可以构建强大的东西的思想。
基本原则
PHP最初很明确的是为非程序员设计的(言外之意,非专业程序);根源已经很难脱离。从PHP2.0文档中挑选出来的对话:
一旦你开始为每个类型区分不同的操作符,你就开始使用语言变得复杂了。例如,你不能为strings使用‘==’,你现在必须用‘eq’。我没看出这点来,特别是那些类似PHP的脚本语言,它们大多数相当简单而多数情况下,作为非程序员,只想要一门包含少量基本逻辑语法的语言,而不想付出过多学习曲线。
PHP为保持前进不惜代价。什么都有比没有好。
这不是个正确的设计原则。早期的PHP受Perl影响;大量的标准库参考C使用“out”参数;OO部分的设计像C++和Java.
PHP从其它语言中引入大量的灵感,但对那些熟知其它语言的人,仍然难以理解。(int)看起来像C,但是int并不存在。命名空间使用\。新的数组语法使用[key=>value],不同于任何其它语言定义hash字面量的形式。
弱类型(例如,默默的自动在strings/mumbers/等间转换)是如此的复杂。
少量的新特性以新语法实现;大多数工作通过函数或者看起来像函数的东西完成。除了类的支持,这理所当然的需要新的操作符和关键字。
本页列出的问题都有官方解决方案—如果你想资助Zend修复它们的开源编程语言的话。
路漫漫,其修远。思考下面的代码,从PHP文档的某地方挑出来的。
- @fopen('http://example.com/not-existing-file', 'r');
它將做什么?
如果PHP使用–disable-url-fopen-wrapper编译,它將不工作。(文档没有说,“不工作”是什么意思;返回null,抛出异常?)
注意这点已在PHP5.2.5中移除。
如果allow_url_fopen在php.ini中禁用,也將不工作。(为什么?无从得知。)
由于@,non-existentfile的警告將不打印。
但如果在php.ini中设置了scream.enabled,它又將打印。
或者如果用ini_set手动设置scream.enabled.
但,如果error_reporting级别没设置,又不同。
如果打印出来了,精确去向依赖于display_errors,再一次还是在php.ini.或者ini_set中。
我无法告诉你这个函数调用的行为,如果没有查看编译时标志,服务器端配置,和我的程序中的配置的话。这些都是内建行为。
该语言充满了全局和隐似状态。mbstring使用全局字符编码。func_get_arg之类的看起来像正常的函数,但是只对当前正在执行的函数操作。Error/exception处理默认是全局的。register_tick_function设置了一个全局函数去运行每个tick(钩子?)—-什么?!
没有任何线程支持。(不奇怪,因为上面已给出。)加之缺乏内建的fork(下面提到),使得并行编程极其困难。
PHP的某些部分在实践中会产生错误代码。
json_decode对不正确的输入返回null,尽管null也是一个JSON解码的合法对象—该函数极不可靠,除非你每次使用后都调用json_last_error.
如果在位置0处找到,array_search,strpos,和其它类似的函数返回0,但如果都没有找到的话。会返回false
让我们稍稍展开最后一部分。
在C中,函数如strpos返回-1,如果未找到。如果你没检查这种情况,却试着以下标使用它,那將可能命中垃圾内存,程序会崩溃。(也许吧,这是C.谁泥马知道。我确定至少有工具处理它)
话说,Python中,等效的.index方法將抛出一个异常,如果元素没找到的话。如果你不检查该情形,程序將崩溃。
在PHP中,该函数返回false.如果你把FALSE作为下标使用,或者用它做其他事情,PHP会默默的將它转成0,但除了用于===比较。程序是不会崩溃的;它將执行错误的逻辑,且无任何警告,除非你记得在每个使用strpos和其它类似函数的地方包含正确的样版处理代码。
这真是糟透了!编程语言只是工具;它们是为我服务的。这里,PHP给我布下了陷阱,等着我跳进去,而我不得不时刻警惕这些无聊的字符串操作和相等比较。PHP是个雷区。
我已经听过很多关于PHP解析器的故事,它的开发者来自世界各地。有从事PHP核心开发工作的人,有调试PHP核心的人,也有和核心开发者交流过的人。没有一个故事是赞赏的。
因此不得不在这里插入一句,因为它值得重复:PHP是个业余爱好者的社区。极少数人设计,为它工作,或极少有人知道他们在做什么。(哦,亲爱的读者,你当然是个极品例外!)那些成长了,想转投其它平台的人,使整个社区的平均水平下降。这个,就是这里,是PHP的最大问题:绝对的盲目领导盲目。
好了,回来面对现实吧。