表达式和操作符 Expressions and Operators
表达式是可以通过求值来产生一个值的
PHP代码块。最简单的表达式是直接量和变量。直接量对自身求值,变量则获取存放在变量中的值。更复杂的表达式由简单的表达式和操作符(operator)构成。
操作符取得一些值(操作数),然后进行某种操作。
PHP操作符(部分):or逻辑或;xor逻辑异或;and逻辑与;+=,-=,*=,/=,.=,%=,&=,|=,^=,~=,<<=,>>=,有操作的赋值;=赋值;?:条件操作符;||逻辑与;&&逻辑与;|按位与;^按位异或;&按位与;==值相等,!=,<>不等于,===值和类型相等,!==值和类型不等;<小于,<=小于或等于,>大于,>=大于或等于;<<左移位,>>右移位;+加法,-减法,.连接字符串;*乘法,/除法,%求模;!逻辑非,~按位非,++自增1,--自减1,(int),(double),(string),(array),(object),类型转换;[数组下标;new创建新
对象。
操作数的数目 Number of Operands
PHP中大多数操作符是二元操作符。也有一元操作符,以及支持三元操作符。
操作符优先级 Operator Precedence
在一个表达式中操作符的求值顺序取决于操作符的相对优先级。
按优先级旋转的表达式不利于理解,大多数程序员更喜欢按更易于理解的顺序写操作符,在需要调整操作顺序时可以用括号把需要优先执行的部分括起来。
在实际编程中许多程序员处理复杂优先级规则的方法是将优先级规则简化为两条规则:乘法和除法比加法和减法优先级高;在其他地方使用小括号。
操作符结合性 Operator Associativity
结合性定义了操作符有相同优先级顺序时求值的顺序。
乘法和除法操作符是左结合(left-associative)。
隐式类型转换 Implicit Casting
将值从一个类型转换到另外一个类型被称为类型转换(casting)。
许多操作符对操作数类型有要求。为了尽可能使程序员不必操作类型细节,PHP会自动在需要时将值从一个类型转换到另外一个类型。
二进制算术操作的隐式类型转换规则:整型与浮点型时,整型转换为浮点型;整型与字符串时,字符串转换为数字,如果转换后的值是浮点型,则将整型转换为浮点型;浮点型和字符串,字符串转换为浮点型。
字符串连接操作符“.”在连接字符串之前将两个操作数都转换为字符串。
字符串在转换为数字的时候,若在字符串开头没有发现数字,字符串的数值就是0。如果字符串包括一个句点“.”或“e,E”,对该字符串求值则生成一个浮点数。
算术操作符 Arithmetic Operators
加法(+);减法(-);乘法(*);除法(/);求模(%),求模操作符将两个操作数转换成整型,并返回第一个操作数除以第二个操作数后所得余数;算术取负(-);算术断言(+)。
字符串连接操作符 String Concatenation Operator
字符串处理是PHP应用程序的核心部分,所以PHP有一个单独的字符串连接操作符(.)。
自动递增和自动递减操作符 Autoincrement and Autodecrement Operators
如果将操作符放在操作数的前面,它返回操作数的新值(递增或递减后的值)。如果将操作符放在操作数的后面,它返回操作数原始的值(在递增或递减之前)。
这些操作符也可应用在字符串上。对一个字母进行递增操作会将它变成字母表中的下一个字母。增加“z”或“Z”将绕回到“a”或“A”,并给前面的字母递增,就像字母处于26个数为基数的系统里一样。
比较操作符 Comparison Operators
不同的操作数类型对应的不同比较关系:
操作数中只要有不完全是数字的字符串,则比较关系为字典的比较关系;操作数中没有不完全是数字的字符串(只有数字或完全是数字的字符串),则比较关系为数字的比较关系。
比较操作符有:相等(==);恒等(===),判断两个操作数是否相等并且是同种类型。此操作符不进行隐式类型转换。对于字符串“0.0”和“0”,==认为它们相同,===认为它们不相等;不相等(!=或<>);不恒等(!==),判断两个操作数是否不相等或者是否类型不同;大于(>);大于或和于(>=);小于(<);小于或等于(<=)。
位操作符 Bitwise Operators
位操作符作用于以二进制表示的操作数上。
位操作符有:
按位取反(~),操作数中的1变成0,0变成1。如果操作数为一个字符串,则结果值为一个和原字符串长度相待的字符串,并且对原字符串中的每个字符取反。
按位与(&),相应位都为1,则结果中的相应位为1,否则,相应位为0。
如果想理解二进制运算,可以使用PHP的函数bindec(),decbin()和decoct()来回转换数字的进制。如果两个操作数都是字符串,反回结果为字符串,它的每一个字符都是对操作数的相应字段按位取反的结果。结果字符串的长度为两个操作数中长度较短的那个字符串的长度,较长字符串中的多余字符将被忽略。
按位或(|),比较操作数中的每一个相应位,若相应位都是0,则结果中的相应位为0,否则为1。如果两个操作数都是字符串,操作符返回结果为字符串,它的每一个字符都是对操作数的相应字符按位或的结果。结果字符串的长度为两个操作数中长度较长的那个字符串的长度,较短字符串在未尾补0。
按位异或(^),比较操作数中的每一个相应位,或相应位中任意一个是1,但不是两个都是1,则结果位为1;否则为0。如果两个操作数都是字符串,操作符返回结果为字符串,它的每一个字符都是对操作数的相应字符按位异或的结果。如果两个字符串的长度不同,则结果字符串的长度为两个操作数中长度较短的那个字符串的长度,较长字符串中的多余字符将被忽略。
左移位(<<),将左边操作数的二进制表示向左移动右边操作数所制定的位数。如果两个操作数不是整数的话,它们都将被转换为整数。每向左移动一位就在右边插入一个0,并且将其他所有位都向左移一位。
数字每左移一位,数字就会增加一倍。左移位的结果是将左操作数乘以2的右移作数次幂。
右移位(>>),将左加操作数的二进制表示向右移动右边操作数所制定的位数。如果两个操作数不是整数的话,它们都将被转换为整数。每向右移动一位就在左边插入一个0,并且将其他所有位都向右移一位,最右的位被丢弃。
逻辑操作符 Logical Operators
逻辑操作符将操作数作为布尔值对待,并且返回布尔值。
逻辑与(&&,and),只有两个操作数都为真时,逻辑与运算的结果才为true,否则,结果为false。
如果第一个操作数的值为false,逻辑与操作符就知道结果也一定为flase,所以右操作数就不会被求值。这种方法被称为短路(short-circuiting),在PHP中通常用这种方法来确保某段代码在一定条件为真时才被执行。
逻辑或(||,or),只要有一个操作数为真,逻辑或运算的结果为true,否则,结果为false。
如果左操作数为true,逻辑或运算的结果一定是true,右操作数就不会被求值。在PHP中,如果某些地方发生错误的话,通常用这种方法来引发一个错误信息。
逻辑异或(xor),如果任意一个操作数为true,但是不是两个都为true时,逻辑异或运算的结果为true。
逻辑非(!),如果操作数的值为false时,逻辑非运算返回布尔值ture,否则,返回false。
类型转换操作符 Casting Operators
类型操作符允许强制将一个值转换为特定的类型。
转换为整型用(int)和(integer);转换为浮点型用(float)和(real);转换为字符串为(string);转换为布尔型(bool)和(boolean);转换为数组为(array);转换为对象为(object)。
并不是所有的类型转换都有效。将一个数组转换为数字类型给出1,将一个数组转换为字符串给出“Array”(在输出中看到的是一个确定的符号,说明你输出的变量包含一个数组)。
将一个对象转换为一个数组,就会建立一个属性数组,从而可以将对象属性名称映射到值。
将数组转换为一个对象则建立了一个对象,它的属性对应数组的键和值。键不再是有效和标识,而是无效和属性名,并且当一个数组被转换为一个对象时,就无法访问,但是当对象被转换回数组时就可以恢复了。
赋值操作符 Assignment Operators
赋值
基本的赋值操作符(=)将一个值赋组变量。
因为所有的操作符都需要返回一个值,所以赋值操作符返回赋给变量的值。
带操作的赋值
简写的赋值操作符由一个二元操作符后面直接跟着一个等号组成。其作用是对操作数本身应用二元操作符,然后把结果赋给左边的操作数。
相加赋值(+=)
相减赋值(-=)
相除赋值(/=)
相乘赋值(*=)
求模赋值(%=)
按位异或赋值(^=)
按位与赋值(&=)
接位或赋值(|=)
连接赋值(.=)
其他操作符 Miscellaneous Operators
错误屏蔽(@),用于阻止一些操作符或函生可能生成的错误信息。
执行(`...`),反撇号操作符把包含在其中字符串当作shell命令执行,并返回一个输出。
条件(?:),条件操作符不是被过度使用就是未充分利用。这是唯一的三元操作符。条件操作符计算在?之前的表达式的值。如果表达式为true, 操作符返回在?和:之间表达式的值,否则,操作符返回在:之后的表达式的值。