开源存在一定局限性
PHP也许确实拥有开源的诸多优势,但缓存等卓越功能却只存在于商用版本当中。当然,这就是现实社会,毕竟Zend需要借此赚取利润。再有,该公司还需要通过向特定用户群体出售非常好的版本的方式支持整个PHP项目。抱怨这一点就像抱怨地心引力带来的不便一样,正确但却毫无意义——地球就在那里,根本不鸟你喜不喜欢。请大家活得理性一些,别总幻想着人们都能活在乌托邦式的开源环境当中。
糟糕的命名空间
大家有没有创建自己函数的打算?如果有,请首先确定到底要使用PHP 5.3或者其后续版本,因为这里正是命名空间出现的分界线。如果大家希望使用早期版本,则必须确保编码内容与库之间不存在冲突——毕竟在早期发展阶段,PHP中的所有内容都具备全局化属性。如果大家决定使用PHP 5.3并接受命名空间的加入,那么请作好准备迎接“反斜杠”——一个丑陋的标点符号——的降临。
糟糕的type安全
这个问题简直可怕,首先举个PHP程序员们喜闻乐见的例子:
(string)"false" == (int)0
请注意,这并不属于那种某些PHP支持者所争论的“函数副作用”的典型情况。毕竟JavaScript当中也包含着大量由于type转换所引发的同类情况。事实上,这一行想表达的是:左侧为字符串,右侧为一个整数。只不过左侧与右侧内容完全相等。照这样说来,如果让PHP的设计者负责管理、世界上的每个人都能彼此和睦相处。
选择太多,冗余太多
PHP语言的一大特色就是可做的事太多,做事的途径同样太多。每一行命令的结尾都可以通过数字符号或者双斜线来进行注释。无论是浮点数字还是双精度数字都代表着同样的含义。简单的设计往往会被人们所忽略,因为大家在代码贡献过程中喜欢添加自己的小特性。这有点像依靠委员会体系进行设计,只不过该委员会从来没考虑到过把其中的差异性剔除掉。
诡异的变量命名规则
把美元符号作为前缀实在不是个好主意。也许强制性地在所有变量前添加这个符号是为了更轻松地将其插入到模板当中,但这样说来常数内容也同样需要这么个符号啊——为什么实际上却用不着呢?
CPU资源争夺战
对于32位计算设备来说,整数数值过大始终是个无法回避的难题。不过在另一方面,64位设备却不会受此影响,也就是说代码在不同设备上的运行状态是不同的。大家可以在自己的笔记本上测试一下,我可以保证事实绝对是如此。但一旦把运行平台转换成服务器,情况则会再度变化。这时如果大家希望重现自己台式机上的错误,结果恐怕要令各位失望。惟一的好消息是,32位设备将很可能最终消失。
SQL注入
将SQL注入这一安全漏洞的主要形式之一归咎于PHP确实有失公允。人们在其它语言当中同样会不慎输入奇怪的SQL字符串。之所以将其纳入文章,主要是考虑到PHP语言更容易让该漏洞攫取数据并发送至MySQL——简单是轻而易举。虽然新手在使用任何一种语言时都可能犯下同样的错误,但这类情况在PHP中出现的机率明显要高得多得多。
不兼容式的变更太多太多
不同版本之间存在巨大差异,兼容性问题也绝不是小事。以Java或者JavaScript为代表的编程语言在快速发展的同时也牺牲了向下兼容的特性。事实上,老代码在新设备上无法运行的问题并不少见。但这一切与PHP的情况其实不尽相同。在PHP方面,不同版本之间往往差别巨大,因此大家只能祈祷自己的服务器已经安装了正确的版本,否则只有在出现严重问题时才能意识到大事不妙。总而言之,在查看服务器上是否有项目需要升级时,请优先把目光对准PHP。