之前写过很久PHP,但现在是PHP黑,简单说一下为什么觉得PHP不好用的原因。
语法语法设计不合理这个诚然有历史原因,但确实是不合理。
命名空间用(\\)分隔,简直丧心病狂;对象成员用(-)访问,略显繁琐函数名不区分大小写,老版本的类名也不区分大小写,而变量名却区分大小写数组的写法繁琐(array()),直到5.4才有简写语法([])这样functiontest_array(arrayinput_array),可以限制参数的类型,适用于类和数组,却不适用于int和stringunset,echo,empty,list长得像函数,却不是函数直到5.4才支持func()[0]这种写法大部分内部函数默认不会抛出异常,导致PHP中存在两套独立的错误处理机制很多被弃用的功能仍被广泛使用,新的功能被普及得很慢这个是使用者的事情,但情况就是如此。
在开源软件中更为突出,比如WordPress为了尽可能兼容旧的PHP版本,没法用上例如匿名函数(5.3),数组简写语法(5.4)这种能够大幅改善代码可读性的功能。
下面是一些被弃用的功能,这些功能大多是设计上存在失误,后来因为可能导致潜在的问题被弃用,但因为网络上互相转载的一些不靠谱教程,所以很多人依然在使用。
__autoloadmysql_*系列函数RegisterGlobalsMagicQuotesSafeMode包管理缺少好用的包管理器和依赖管理方案
PHP和Python、Ruby、Node.js在使用领域上是有一定重叠的,我们来比较一下包的数量:
PHPComposer:46kPythonPyPI:53kRubyGems:94kNode.jsNPM:k虽然包的数量不代表质量,但是代表了人们是否愿意发布和使用包。
Composer在PHP中的普及率恐怕不及上面其他三款包管理器,比如作为最火的博客程序WordPress,和国内的Typecho都没有使用Composer,而是直接在源代码中包含所有依赖。
性能必须为每个请求创建一个单独的进程
PHP必须为每个请求创建一个进程(或线程),这导致在高并发的情况下会占用大量内存。
在PHP中很难创建一个资源,并让它可以在全局范围内,可以被所有请求访问到,只能通过外部的数据库或缓存来实现。亦没有办法定义一项任务,独立于其他请求运行,只能通过单独的任务队列来解决。虽然这两个问题并不严重,但无法轻量级地维护全局的状态,算是一个缺憾。
优化PHP是为Web优化的编程语言
可以直接用_GET和_POST访问来自客户端的GET和POST数据可以用?php?的方式嵌入到HTML文件中现在大多数Web程序,往往都是MVC架构,在这种架构下,具有额外语法糖的PHP并不会比通用编程语言更好用。
相反的方面,虽然PHP可以用于Web之外的场景,但坑实在是多。例如缺少好用的异步流程控制的方案等。