一、表达式
所有表达式至少由一个操作数和一个或多个运算符(操作符)组成。
$age = 18;
$age = '18';
$sum = $age*2;
操作数
$a++; //$a 是操作数
$sum $val1 + $val2; //$sum、$val1和$val2 是操作数
二、运算符(操作符) operator
表达式中指定某个动作的符号。
1、算术运算符
运算符 | 名称 | 例子 | 结果 |
---|---|---|---|
+ | 加法 | $x + $y | $x 与 $y 求和 |
- | 减法 | $x - $y | $x 与 $y 的差数 |
* | 乘法 | $x * $y | $x 与 $y 的乘积 |
/ | 除法 | $x / $y | $x 与 $y 的商数 |
% | 模数 | $x % $y | $x 除 $y 的余数 |
- 对于非数值的操作数,PHP在算术运算时会自动将其转换成一个数字
$a = 100; $b = '12abc'; var_dump($a+$b); // int 112
%
求模运算符:求余,首先将两边操作数转化为整形。$a = 100.88; $b = '12abc'; var_dump($a%$b); //4
2、 递增/递减运算符
运算符 | 名称 | 描述 |
---|---|---|
++$x | 前递增 | $x 加一递增,然后返回 $x |
$x++ | 后递增 | 返回 $x,然后 $x 加一递增 |
--$x | 前递减 | $x 减一递减,然后返回 $x |
$x-- | 后递减 | 返回 $x,然后 $x 减一递减 |
$x=10;
echo ++$x; // 输出 11
$y=10;
echo $y++; // 输出 10
$z=5;
echo --$z; // 输出 4
$i=5;
echo $i--; // 输出 5
$a = 10;
$b = $a++ + ++$a;
//22
注意:
- 递增/递减运算符不影响布尔值。
- 递减 NULL 值也没有效果,但是递增 NULL 的结果是1
3、字符串运算符
拼接操作符.
和拼接赋值操作符.=
define('ROOT','username');
$str = '用户设置的字段是:'.ROOT;
$str_h = '<h1>';
$str_h .= $str.'</h1>';//$str_h = $str_h .$str . '</h1>';
echo $str_h;
//模拟验证码
$string = '0123456789abcdefghijklmnopqrstxyzABCDEFGHIJKLMNOPQRSTXYZ';
$first = $string{mt_rand(0,strlen($string)-1)};
$verify_code = '';
$rgb = 'rgb('.mt_rand(0,255).','.mt_rand(0,255).','.mt_rand(0,255).')';
$verify_code = "<span style='font-weight:700;font-size:35px;color:{$rgb}'>{$first}</span>";
echo $verify_code;
echo mb_strlen('我爱你');
4、赋值运算符
赋值 | 等同于 | 描述 |
---|---|---|
x = y | x = y | 右侧表达式为左侧运算数设置值。 |
x += y | x = x + y | 加 |
x -= y | x = x - y | 减 |
x *= y | x = x * y | 乘 |
x /= y | x = x / y | 除 |
x %= y | x = x % y | 模数 |
5、比较运算符
PHP 比较运算符用于比较两个值(数字或字符串):
运算符 | 名称 | 例子 | 结果 |
---|---|---|---|
== |
等于 | $x == $y | 如果 $x 等于 $y,则返回 true。 |
=== |
全等(完全相同) | $x === $y | 如果 $x 等于 $y,且它们类型相同,则返回 true。 |
!= |
不等于 | $x != $y | 如果 $x 不等于 $y,则返回 true。 |
<> |
不等于 | $x <> $y | 如果 $x 不等于 $y,则返回 true。 |
!== |
不全等(完全不同) | $x !== $y | 如果 $x 不等于 $y,且它们类型不相同,则返回 true。 |
> |
大于 | $x > $y | 如果 $x 大于 $y,则返回 true。 |
< |
大于 | $x < $y | 如果 $x 小于 $y,则返回 true。 |
>= |
大于或等于 | $x >= $y | 如果 $x 大于或者等于 $y,则返回 true. |
<= |
小于或等于 | $x <= $y | 如果 $x 小于或者等于 $y,则返回 true。 |
$a = 8; // 8为一个整数
var_dump($a == 8); // 比较值;返回true
var_dump($a == '8'); // 比较值(忽略类型);返回true
var_dump($a === 8); // 比较类型/值(整数 vs. 整数);返回true
var_dump($a === '8'); // 比较类型/值(整数 vs. 整数);返回false
/**
* 严格比较
*/
if (strpos('testing', 'test')) {
// 在位置0找到'test',0被解释为布尔值'false'
// code...
}
vs.
if (strpos('testing', 'test') !== false) {
// true,因为做了严格比较(0 !== false)
// code...
}
6、逻辑运算符
运算符 | 名称 | 例子 | 结果 |
---|---|---|---|
and | 与 | $x and $y | 如果 $x 和 $y 都为 true,则返回 true。 |
or | 或 | $x or $y | 如果 $x 和 $y 至少有一个为 true,则返回 true。 |
xor | 异或 | $x xor $y | 如果 $x 和 $y 有且仅有一个为 true,则返回 true。 |
&& | 与 | $x && $y | 如果 $x 和 $y 都为 true,则返回 true。 |
|| |
或 | $x || $y |
如果 $x 和 $y 至少有一个为 true,则返回 true。 |
! | 非 | !$x | 如果 $x 不为 true,则返回 true。 |
//文件是否存在
file_exists('phpinfo.php') OR die('文件不存在');
//Yii2框架主入口文件 定义debug状态和开发环境
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
7、其他运算符
a.三元运算符
1) (expr1) ?(expr2):(expr3)
当expr1的值为true,取expr2的值,否则去expr3
$ok = 60;
$xiaoming = 65;
echo ($xiaoming > $ok) ? '及格' : '不及格';
2) (expr1) ?:(expr3)
当expr1为真返回expr1,否则返回expr3
//$abc = '我设置了';
isset($abc)?:$abc='如果变量a未设置执行我啊';
echo $abc;
b.@
错误抑制运算符
放在表达式前,该表达式可能产生的任何警告信息都被忽略掉。 只对表达式有效,如可以放在变量、函数调用,已经常量之前;但不能放在函数或类的定义之前,也不能用于条件结构,例如if和foreach。
$a;//未赋值,会出现notice警告
@var_dump($a);
//除数为0也报错
$a = 10;
$b = @$a/0;
c.执行运算符
PHP将试着将反向单引号(``)之间的命令当做服务器端的命令来执行。表达式的值就是命令的执行结果。
//Windows环境下
$lookIp = `ipconfig`;
echo "<pre>$lookIp</pre>";
//Unix下
$out = `ls -la`;
echo "<pre>$out</pre>";
三、运算符优先级
1、http://php.net/manual/zh/language.operators.precedence.php 在线手册,优先级自上而下,由高到低。
2、如果运算符优先级相同,左结合方向意味着将从左到右求值,右结合方向则反之
3、优先级最高的操作符括弧()
,可以引用小括号来控制运算顺序。
4、逻辑运算符 注意出现的短路现象
应用实例:
$a = 10;
$b = 2;
echo $a.'-'.$b.'='.$a-$b;
//一道入职面试题
$a = 1;
echo ++$a + ++$a;
//sina的开放平台的sdk中的
@$var_a or $var_a = 'a string or others';
//等同于
isset($var_a) ? $var_a : 'a string or others';
//MySQL数据库连接经典代码
$result = mysql_query(*) or die(mysql_error());
/*********************************/
//短路的例子
$a = 1;
//$a==1 || $c = 100; //逻辑或的运算结果是运算符(||)的两边只要有一个为真,结果就返回“真”后就不再执行其它表达式,所以在这个语句里已经判断到$a的返回值是“真”,就不再执行给$c赋值,这样就形成了一个短路现象,所以后面的输出语句不输出内容。
$a==2 && $c=100; //逻辑与的运算符(&&),逻辑与的运算方式是运算符的两边表达式都为“真”才会继续执行其他语句而直接返回一个“假”值,所以这条语句也将不执行$c的赋值。
echo '$c的值:'.$c;
------------------------
$a = 3;
$b = false;
$c = $a or $b;
echo $c;
//这里的$c为int值3,而不是boolean值true
$a = 3;
$b = false;
$c = $a || $b;
echo $c;
//这里的$c就是boolean值true了!