我认为PHP不好的地方

May 22, 2014

最近在用PHP做项目,让我个人感觉PHP是门非常不顺手的编程语言。PHP太多东西给人的感觉就像是一个半成品。

namespace

PHPnamespace 是我见过的所有语言最难用的 namespace,没有之一。它使用反斜杠\**来进行层级切分,在使用上非常容易跟 include 使用的文件路径斜杠搞混淆。namespace** 的 use 语句使用也是让人赶到非常奇怪,它不能在代码中的任意作用域使用,只能在一个文件的最顶级作用域中使用 usenamespace 这个东西是控制访问冲突使用的,在文件顶级作用域中使用 namespace 是一个产生冲突的隐患。这就是一个半成品,PHP 中的内部库函数是没有使用 namespace 的,也不知道他们自己为啥不用这玩意。

变量

在每一个变量前加一个$符号,让我对这个语言的第一印象非常不好,给我的感觉是丑陋。变量名加$可以很方便的嵌入到字符串中,但是 PHP 在字符串内嵌中增加了 {} 语法,这让变量前面 $ 符号失去了它唯一的作用。$ 符号除了让代码变得更丑陋以外,没有任何的实际用处。另外在 PHPiffor 还有 while 一系列控制语句中,变量是没有作用域的。可以很随意的去拿 ifelse 中的变量,解释器不会报错。但是你不知道什么时候解释器会给你报一个 undefine 的错误。

函数与闭包

函数本身没啥好说的,每个语言最基本的单元。如果这玩意也实现不好那真的太糟了。但我要说的是 PHP 从5.3以后引入的匿名函数。PHP 的匿名函数看起来好像是可以在任意的地方定义它,这很符合匿名函数的特性。但问题是你如果要用到上下文变量需要显示的使用 use 将变量引入。这看起来好像是没有什么问题,但是如果函数嵌套的层级一多,这完全是个枷锁。另外如果要判断一个变量是不是一个函数 PHP 有一个 is_callable 的方法,这个方法的奇怪之处在于你可以传入变量名或者以字符串形式传入函数名。但如果直接传入一个函数它返回的值是 false。经过使用 is_callable 函数的一些失败尝试后,我彻底放弃了 PHP 的匿名函数与闭包。