PHP的操作符

一、表达式

所有表达式至少由一个操作数和一个或多个运算符(操作符)组成。

$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了!