3.4 表达式和操作符
表达式是PHP语言最重要的概念。任何有值的式子那是一个PHP表达式。
最基本的表达式形式是常量和变量。用操作符连接常量和变量构成的式子是表达式的常见形式。
例如:
defi ne("PI",3.14); $a=1000; $b=$a; $c=PI; $d=($a+$b);
稍复杂的表达式是函数以及包含函数的运算式。
例如:
function five() { return 5; } $e=five(); //变量$e的值等于函数five()的返回值5 $f=$e+fi ve();//变量$f的值等于10
书写表达式时,需要注意以下几点:
1 按照人们的一般运算逻辑和思维方式书写。
2 以易于理解为第一追求,有利效率为第二追求。
3 必要时加上注释。
操作符也叫运算符,是具有特定运算意义的标准运算符号,利用它可以就给出的一或多个表达式来产生另一个新值。比如,“+”代表数学意义上的求和运算,“*”代表数学意义上的求积运算,等等。
PHP语言有三种类型的运算符:第一类是一元运算符,只对一个操作数运算,例如!(取反运算符,逻辑非)或++(加1运算符)。第二类是有限二元运算符,PHP中的大多数运算符属于此类。第三类是三元运算符。只有?:一个。它实际上相当于一个两分支判断程序,使用时应该把整个三元表达式放到括号()里,以利于理解其返回值。
当表达式中有多个运算符时,就涉及优先级问题。比如:表达式2+2*2的值是6,而不是8。是因为运算符*的优先级高于运算符+,所以2+2*2相当于2+4,而不是4*2。
如果运算符优先级相同,则按照从左到右的顺序依次运算。
在PHP中有很多运算符,当构成表达式的运算符比较多,我们不易理清其运算顺序时,建议使用括号()来强制运算的优先顺序,而不必刻意追求表达式的书写格式,这样可以增强代码的可读性。
除了运算符的优先级之外,还有运算符的结合方向需要考虑,主要是二元运算符。它们分为左结合运算符和右结合运算符。通俗地讲,就是从运算符左边的表达式向右边的表达式结合进行运算就属
$a=500/100; //运算符"/"左边的500为被除数,右边的100为除数,$a的值为5 $a+=100; //运算符"+="右边的100向左运算,加到$a上,故结果是$a=105
PHP语言中操作符的结合性和运算优先级如表3-4所示。
表3-4 操作符的优先级和结合性
PHP语言的操作符可以分为算术运算符、赋值运算符、位运算符、比较运算符、递增递减运算符、逻辑运算符、字符串运算符、数组运算符、类型运算符、错误控制运算符和执行运算符。
3.4.1 算术运算符
包括+、-、*、/、%共5个,分别对应算术中的加、减、乘、除、取模运算。主要注意的是除号/返回结果总是浮点数,即使两个运算数是整数也是这样。取模运算较为复杂,当两个操作数都是正数时结果为正,如果有一个操作数为负,那么余数的符号则取决于机器,比如21%-5,结果可能为-1或1。如果有两个操作数都是负数,应该是得出结果为负数。
3.4.2 赋值运算符
基本的赋值运算符是=。它的含义并不是“等于”。它意味着把右边表达式的值赋给左边的运算数或变量。
例如:
$a=100+100; //含义是把=号右边的表达式100+100的值(等于200)赋值给变量$a
赋值运算表达式的值也就是所被赋的值。也就是说,赋值表达式$a=100的值是100。
例如:
$a=($b=100)+100; //结果是变量$b的值为100,变量$a的值为200
赋值运算是将=号右边的值复制到=左边的新变量中,属于传值赋值。
3.4.3 位运算符
包括&、|、^、~、<<、>>共6个。分别对应与、或、异或、非、左移、右移运算。
位运算符是对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的ASCII值。
位运算符实际上是对操作数换算成二进制表示形式,对其二进制位进行的操作。
位运算符的运算意义如表3-5所示。
表3-5 位运算符的运算意义
例如:
echo 12^9; //显示输出的结果为5
十进制数12的二进制表示是1100,9的二进制表示是1001,根据异或运算的“相同为0,不同为1”规则,结果为0101,即十进制数5。
需要注意的是,在32位系统上不要右移超过32位,也不要在结果可能超过32位的情况下左移。以上两种情况会使位“溢出”,运算结果出错。
3.4.4 比较运算符
顾名思义,比较运算符是对两个值进行比较而得到返回值。包括==、===、!=、<>、!==、<、>、<=、>=、?:共10个运算符。
比较运算符的运算意义如表3-6所示。
表3-6 比较运算符的运算意义
三元条件运算符?:稍微特殊,它的基本使用格式是(expr1) ? (expr2) : (expr3),在expr1求值为TRUE时,三元条件运算符?:构成的整个表达式的值为expr2,在expr1求值为FALSE时整个表达式的值为expr3。
例如: $a=1?2:3; //此时$a的值为2 $b=0?2:3; //此时$b的值为3 $c=($a>$b)?2:3; //此时$c的值为3,因为expr1(即$a>$b)求值为FALSE。 $d=($a<$b)?2:3; //此时$d的值为2,因为expr1(即$a<$b)求值为TRUE。
如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。
对于多种的数据类型,比较运算符根据表3-7进行比较。
表3-7 比较多种类型
3.4.5递增递减运算符
PHP语言支持C语言风格的前、后递增与递减运算符。递增递减运算符的运算意义如表3-8所示。
表3-8 递增递减运算符的运算意义
例如: $a=1; $b=$a++; //$b的值为1,$a的值为2 $b=++$a; //$a的值为3,$b的值为3
注意:
递增递减运算符不影响布尔类型变量的值。递减NULL值也没有效果,但是递增NULL的结果是1。
在处理字符变量的算术运算时,PHP沿袭了Perl的习惯,而非C的。例如,在Perl中 'Z'+1将得到'AA',而在C中,'Z'+1将得到'['(ord('Z') == 90,ord('[') == 91)。注意字符变量只能递增,不能递减。
例如:
$i = 'W'; for ($n=0; $n<6; $n++) { echo ++$i . "\n"; }
将输出: X Y Z AA AB AC
3.4.6 逻辑运算符
包括and、or、xor、!、&&、||共6个,分别对应与、或、异或、非、与、或逻辑运算。“与”和“或”有两种不同形式运算符,它们运算的优先级不同,见表3-3。
逻辑运算符的运算意义如表3-9所示。
表3-9 逻辑运算符的运算意义
3.4.7 字符串运算符
包括.、.=共两个。第一个.称为连接运算符,第二个.=称为连接赋值运算符。其作用都是将两个字符串连接成一个字符串。
例如:
$a="Hello "; $b=$a."World!"; //字符串变量$b的内容为"Hello World!" $a="Hello "; $a.="World!"; //字符串变量$a的内容为"Hello World!"
3.4.8 数组运算符
包括+、==、===、!=、<>、!==共6个,数组运算符的运算意义如表3-10所示。
表3-10 数组运算符的运算意义
+运算符执行两个数组的联合运算,就是把右边的数组附加到左边的数组后面,但是重复的键值不会被覆盖。
例如:
$a=array("a"=>"Tom", "b"=>"Jerry"); $b=array("a"=>"Mary", "b"=>"Yao", "c"=>"apple"); $c=$a+$b; // $a和$b的联合 echo "Union of \$a and \$b: \n"; ar_dump($c); //此函数通过缩进显示数组的结构信息, 如果是多维数组将递归展开类型与值。 $c=$b+$a; // $b和$a的联合 echo "Union of \$b and \$a: \n"; var_dump($c);
上述代码将显示:
Union of $a and $b: array(3) { ["a"]=> string(3) "Tom" ["b"]=> string(5) "Jerry" ["c"]=> string(5) "apple" } Union of $b and $a: array(3) { ["a"]=> string(4) "Mary" ["b"]=> string(3) "Yao" ["c"]=> string(5) "apple" }
3.4.9 类型运算符
类型运算符:instanceof。instanceof用来测定一个给定的对象是否来自指定的对象类。instanceof运算符是PHP5引进的。
例如:
class A { } class B { } //定义了两个类A、B $thing=new A; //声明类A的一个对象$thing if ($thing instanceof A) { echo 'A'; } if ($thing instanceof B) { echo 'B'; } 输出: A
3.4.10 错误控制运算符
错误控制运算符只有1个:@。当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
例如:
$c=@mysql_connect(); //此处参数省略,将使用默认参数
上面的语句是使用函数mysql_connect()建立了一个MySQL数据库连接,但是连接失败将不会提示任何出错信息。
3.4.11 执行运算符
``,反引号,数字键1左边键的字符。反引号中的内容将作为操作系统命令来执行,并将其输出信息赋值给一个变量。
例如:
$out_OS=`ipconfig /all`; echo $out_OS;
输出结果为本机网络连接的详细配置信息。