php让人难堪。它是如此的破碎,但那些被培训的业余爱好者,却对它称赞不已。php在做一些徽不足道的挽回措施,但我选择忘记它。
前言
我的脾气古怪。我会抱怨很多东西。这个星球上大多数技术我都不喜欢。
PHP不仅使用起来尴尬,还有要嘛我想要的不适合,要嘛不是最令人满意,要嘛违背我的信仰。我可以告诉你关于一门语言,所有我想避免的好方式,所有我喜欢的坏方式。来吧,问吧!谈话会很有趣!
php是唯一的例外。几乎php抽象的所有东西都是支离破碎的。包括语言,框架,整个生态系统都一塌糊涂。我几乎不能单独列出咒骂的事情,因为它全身都坏了。每次我打算编辑一堆杂乱如麻的php抱怨清单的时候,我都被一些琐事打乱,越深入就越会发现其它令人震惊的事情。
php让人难堪。它是如此的破碎,但那些被培训的业余爱好者,却对它称赞不已。php在做一些徽不足道的挽回措施,但我选择忘记它。
不过我得让我的系统摆脱这些东西,也就这样了,这是最后一次尝试。
打个比喻
我只是随口和Mel抱怨下,而她却坚决让我发表出来。
我甚至说不出来PHP到底怎么了,因为—还好。想想你有一个,嗯,工具箱吧。一堆工具。看起来还好,有标准的东西。
你拔除螺丝钉,它怪异的有三个头。OK,好吧,这对你不太有用,但你猜迟早有天会有用。
你拿出榔头,被震住了,两边都有是尖爪。但它仍然能用,我的意思是,你可以用两头的中部斜着敲。
你拿出老虎钳,但它们没有锯齿面。表面平而光滑。这没多大用,但依然能用,没什么。
你可以继续。工具箱的东西都是怪异和琢磨不定的,但又不能说毫无价值。整体看没什么大问题;它的工具都齐全。
现在,想象有很多使用这些工具的木匠,它们和你说:”这些工具有什么问题呢?我们都用过,它们工作都很好啊!”。工匠们给你展示他们建的房子,每个门都是五边形的而屋顶是癫倒的。你敲前门,它向内倒榻了,而他们却抱怨你打破了他们的门。
这就是PHP的问题。
立场
我认为下面的特质对于一门语言的生产力和可用性是重要的,而PHP在大范围破坏它们。如果你不同意这些,好吧,我无法想像,我们永远不会达成一致。
一门语言必须是可预见的。它是將人类的思想反映给计算机执行的媒介,因此它的关键是,人类对程序的理解实际要正确。
语言必须一致。相似的东西就要看起来相似,不同的就是不同。学习了语言的部分知识,就应能很容易理解剩下的部分。
语言必须简洁。新语言应该减少继承旧语言的不好的形式。(我们也可以写机器码。)新语言当然应努力避免织入新的特有的形式。
语言必须是可靠的。语言是解决问题的工具;应尽量避免引入新问题。任何”陷阱”都会大量的分散注意力。
语言必须是可调试的。当出错的时候,程序员必须修正它,我们需要获得我们想要的帮助。
我的立场是:
PHP到处处充满惊奇:mysql_real_escape_string,E_ACTUALLY_ALL
PHP不一致:strpos,str_rot13
PHP需要特别形式:error-checkingaroundCAPIcalls,===
PHP古怪:==。for($fooas&$bar)
PHP晦涩:默认无栈跟踪或fatals,复杂的错误报告
我不能就单个问题解释为什么它归为这些类,否则將会没完没了。我相信读者自己会思考。
不要再和我扯这些东西了
我知道很多有利的论点。我也听到很多反驳的论点。这些都只能让谈话立即停止。不要再跟我扯这些东西了,求你了。
不要和我说”好的开发者能用任何语言写出好的代码”,或者坏开发者。.吧啦吧啦。这毫无意义。好的工匠可以用石头或锤子驾驭钉子,但你见过有多少工匠用石头的?成为一个好开发者的标准之一就是善于选择工具。
不要和我说熟记上千个例外和古怪行为是开发者的职责。是的,这在任何系统中都是必要的,因为电脑是傻的。这不意味着,系统能疯狂的接受而没有上限。PHP有的只是异常,这是不行的,一旦和语言摔角决斗,你实际编写程序就要花费更多的努力。我的工具不能为我创建应用产生积极作用。
不要和我说“那就是CAPI的工作方式”。这星球上高级语言存在的目的是什么,它们能提供的一切仅仅是一些字符串助手函数和一堆C的包装器?如果是这样,那就用C!这里,甚至还有为它准备的CGI库。
不要和我扯“搞出奇怪的事,是你活该”。如果存在两个特性,总有一天,某些人会找到一起使用它们的理由。再次强调,这不是C;这里没有规范,这里不需要“未定义行为”。
不要再和我扯Facebook和Wikipedia就用的PHP.我早知道了!它们也能用Brainfuck写,但只要他们足够陪明,不断折腾这些事情,他们总能克服平台的问题。众所周知,如果使用其它语言编写,开发时间可能会减少一半或加倍;单独拿出这些数据毫无意义。
上帝保佑,不要再和我扯任何东西了!如果列出的没有伤害你的PHP的观点,无所谓,因此请停止在网上做无意义的争论,继续开发高帅富酷的站点来证明我是错的。
偷偷告诉你:我非常喜欢Python.我也很乐意对它说些你不爱听的话,如果你真想的话。我并不要求它完美;我只是想扬长避短,总结我想要的最佳东西。
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给我布下了陷阱,等着我跳进去,而我不得不时刻警惕这些无聊的字符串操作和相等