PHP的问题:全面阐述PHP网站设计的问题

2012-04-21 09:58:30  来源:伯乐在线 

WebjxCom提示:php让人难堪。它是如此的破碎,但那些被培训的业余爱好者,却对它称赞不已。php在做一些徽不足道的挽回措施,但我选择忘记它。

操作符

==不中用。

"foo"==TRUE,和"foo"==0…但,当然TRUE!=0。

==会將两边转成数字,如果可能的话,这意味着它將转成floats如果可能。所以大的16进制字符串(如,passwordhashes)可能偶然会比较成true,尽管它们不一样。就连JavaScript都不会这样做。

由于某些原因,"6"=="6""4.2"=="4.20",和"133"=="0133"。但注意133!=0133,因为0133是八进制的。

===比较值和类型…除了对象,只有两边实际上是同一对象才为true!对于对象,==比较值(或每个属性)和类型,这又是===比较任何非对象类型的行为。好玩吗?

比较大小也好不到哪去。

甚至行为都不一致:NULL<-1,而NULL==0。排序也因此不确定;它依赖于在排序中比较元素的算法的顺序。

比较操作符尝试排序数组,以两种不同的方式:首先按长度,然后按元素。如果它们有相同数量的元素但不同的keys,它们是不可比的。

对象比较比其它比较做得更多…除了那些即不小于也不大于的对象。

为了类型更安全的==比较,我们有===。为了类型更安全的<比较,我们有…什么也没有。"123"<"0124",通常,不管你怎么做。类型转换也无济于事。

尽管上面的举动很疯狂,但却明确拒绝Perl’s的字符串paris和算术运行符,PHP没有重载+.+就是通常的+,而。是通常的连接符。

[]下标操作符也可以拼写成{}。

[]可以用于任何变量,不光是字符串和数组。它返回null,无错误警告。

[]仅能获取单个元素。

foo()[0]是个语法错误。(已在PHP5.4中修复)

不像(从字面上看)任何其它语言都有的类似的操作符,?:是左结合的。因此:

  1. $arg = 'T';
  2. $vehicle = ( ( $arg == 'B' ) ? 'bus' :
  3. ( $arg == 'A' ) ? 'airplane' :
  4. ( $arg == 'T' ) ? 'train' :
  5. ( $arg == 'C' ) ? 'car' :
  6. ( $arg == 'H' ) ? 'horse' :
  7. 'feet' );
  8. echo $vehicle;

打印horse.

变量

无法声明变量。当第一次使用时,不存在的变量会被创建为null值。

全局变量在使用前,需要global声明。这是根据上面得出的自然结果,因此这是个完美的理由,但,如果没有显示的声明,全局变量甚至无法读取—PHP將悄悄的创建一个局部同名变量取代它。我还没见过其它语言使用类似的方法处理范围问题。

没有引用。PHP所谓的引用是个真正的别名;这无疑是一种倒退,不像Perl的引用,也没有像Python那样的对象标识传递。

没有明显的方式检测和取消引用。

”引用”使变量在语言中与众不同。PHP是动态类型的,因此变量通常无类型…除了引用,它修饰函数定义,变量语法,和赋值。一旦变量被引用(可在任何地方发生),它就一直是个引用。没有明显的方法探测和解引用需要的变量值。

好吧,我说谎了。有些”SPLtypes”也作用于变量:$x=newSplBool(true);$x="foo";將失败。这有点像静态类型,自己看看。

Areferencecanbetakentoakeythatdoesn’texistwithinanundefinedvariable(whichbecomesanarray)。Usinganon-existentarraynormallyissuesanotice,butthisdoesnot.

通过函数定义的常量称为takingastring;这之前,它们不存在。(这可能实际上是复制Perl使用常量的行为。)

变量名是大小写敏感的。函数和类名不是。使得方法使用驼峰式命名会很奇怪。

结构

array()和几个类似的结构不是函数。$func="array";$func();不工作。

数组拆包可以使用list($a,$b)=…操作完成。list()是类函数语法,就像数组那样。我不知道为什么不给一个真正的专用语法,也不知道为什么名字如些的让人迷惑。

(int)很显然的被设计成类似C,但它不是单独的标记;在语言中,没有东西被称为int.试试看:var_dump(int)不工作,它会抛出一个解析错误,因为参数看起来像是强制转操作符。

(integer)是(int)的别名。也有(bool)/(boolean)和(float)/(double)/(real)。

有个(array)操作符用来转成数组和(object)用来转成对象。这听起来很贴心,但常常有个用例:你可以用(array)使得某个函数参数,既可以是单个元素,也可以是列表,相同对待。但这样做不可靠,因为如果某人传递了单个对象,把它转换成数组將实际上生成了一个包含对象属性的数组。(转换成对象执行了反转操作。)

include()这类的函数基本上就是C的#include:他们將其它的文件源码转存到你的文件中。没有模块系统,甚至对PHP代码也一样。

没有类似嵌套或者局部范围的函数或类。它们都是全局的。include某文件,它的变量导入到当前函数范围中(给了文件访问你的变量的能力),但是函数和类存入全局范围中。

追加数组使用$foo[]=$bar.

echo不是函数。

empty($var)是如此极端,对于任何其它东西不表现为函数,除了变量,e.g.empty($var||$var2),是个解析错误。为什么地球上有这种东西,解析器为什么需要了解empty?

还有些冗余的语法块:if(…):…endif;,等等。

更多