操作符
==不中用
。
"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中修复)
不像(从字面上看)任何其它语言都有的类似的操作符,?:是左结合的。因此:
$arg='T';
$vehicle=(($arg=='B')?'bus':
($arg=='A')?'airplane':
($arg=='T')?'train':
($arg=='C')?'car':
($arg=='H')?'horse':
'feet');
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;,等等。