# 运算符
[toc]
## 1. 算术运算符
| 序号 | 运算符 | 示例 | 描述 |
| ---- | ------ | ----------- | ------------------ |
| 1 | `+` | `$a+$b` | $a与$b 的和 |
| 2 | `-` | `$a-$b` | $a与$b 的差 |
| 3 | `*` | `$a*$b` | $a与$b 的积 |
| 4 | `/` | `$a/$b` | $a与$b 的商 |
| 5 | `%` | `$a%$b` | $a与$b 的余(模) |
| 6 | `++` | `$a++/++$a` | 先用再加/先加再用 |
| 7 | `--` | `$a--/--$a` | 先用再减/先减再用 |
| 8 | `**` | `2**4` | 幂运算:2 的 4 次方 |
- `$a++`=>`$a = $a + 1`, `$a--`=>`$a = $a - 1`
- `**`: 幂运算需要 `php5.6+`版本
---
## 2. 字符串运算符
| 运算符 | 示例 | 描述 |
| ------ | --------------- | ----------------------------- |
| `.` | `$str1 . $str2` | 连接运算,返回连接之后的字符串 |
---
## 3. 赋值运算符
| 序号 | 运算符 | 示例 | 描述 |
| ---- | ------ | ----------- | -------------------- |
| 1 | `=` | `$a = 10` | 将表达式的值赋给变量 |
| 2 | `+=` | `$a += 10` | `$a = $a + 10;` |
| 3 | `-=` | `$a -= 10` | `$a = $a - 10;` |
| 4 | `*=` | `$a *= 10` | `$a = $a * 10;` |
| 5 | `/=` | `$a /= 10` | `$a = $a / 10;` |
| 6 | `%=` | `$a %= 10` | `$a = $a % 10;` |
| 7 | `.=` | `$a .= 'a'` | `$a = $a . 'a';` |
---
## 4. 比较运算符
| 序号 | 运算符 | 示例 | 描述 |
| ---- | ------ | ----------- | ------------------------ |
| 1 | `>` | `$a > $b` | 大于 |
| 2 | `>=` | `$a >= $b` | 大于或等于 |
| 3 | `<` | `$a < $b` | 小于 |
| 4 | `<=` | `$a <= $b` | 小于或等于 |
| 5 | `==` | `$a == $b` | 等于 (值相等即可) |
| 6 | `===` | `$a == $b` | 全等于(二边值与类型全等) |
| 7 | `!=` | `$a != $b` | 不相等 |
| 8 | `!==` | `$a !== $b` | 不全等 |
| 9 | `<=>` | `$a <=> $b` | 太空船`php7+` |
- 比较运算符: 返回布尔值,常用于流程控制中(`if/while/for...`)
- `<=>`: 也叫组合比较符, 例如`$a <=> $b`, 有三种返回结果
| 序号 | 运算 | 结果 |
| ---- | --------- | -------------- |
| 1 | `$a > $b` | 返回`>0`的整数 |
| 2 | `$a < $b` | 返回`<0`的整数 |
| 3 | `$a = $b` | 返回`=0`的整数 |
示例代码: `demo15.php`
```php
// 比较运算符返回布尔值
var_dump(10 > 20);
// `==`二边值类型不同时,会自动转换,值相等返回true
var_dump('10' == 10);
// `===`: 不发生转换,要求值与类型都相同才返回true
var_dump('10' === 10);
// 结果: bool(false) bool(true) bool(false)
echo '<hr>';
# 太空船运算符
var_dump(10 <=> 20);
var_dump(10 <=> 5);
var_dump(10 <=> 10);
// 结果: int(-1) int(1) int(0)
```
---
## 5. 逻辑运算符
| 序号 | 运算符 | 示例 | 描述 |
| ---- | ------ | ----------- | -------- |
| 1 | `&&` | `$a && $b` | 逻辑与 |
| 2 | `||` | `$a || $b` | 逻辑或 |
| 3 | `!` | `!$a` | 逻辑非 |
| 4 | `xor` | `$a xor $b` | 逻辑异或 |
- 逻辑运算符二边表达式必须是布尔类型
- 对应别名: `&&` => `and`, `||` => `or`, `!` => `not`
- 优先级: `!` > `&&` > `||`
- 异或: 当二边表达式运算结果不相同时,结果为`true`
示例代码: `demo16.php`
```php
error_reporting(E_ALL ^ E_NOTICE);
// 逻辑运算符
// && 二边全为true,结果为true
var_dump((3 < 4) && (5 > 8));
// && 二边只要有一个为true,结果为true
var_dump((3 < 4) || (5 > 8));
// 当$name存在且值等admin时显示欢迎词
// 未定义的变量返回false
if ($name && $name === 'admin') {
echo '欢迎您';
} else {
echo '未登录';
}
```
---
## 6. 三元运算符
| 序号 | 运算符 | 示例 | 描述 | 场景 |
| ---- | ------ | ---------- | ------------------------- | ---------- |
| 1 | `?:` | `$a ?: $b` | 仅判断表达式`true/false` | 简化双分支 |
| 2 | `??` | `$a ?? $b` | 判断变量存在且不为 `null` | 设置默认值 |
- 其实`??`不算三元运算符: 准确讲应该是`NULL合并符`
- `??`: 需要满足二个条件(1)变量存在(2)且值不为`null`,其实就是`isset()`的要求
示例代码: `demo17.php`
```php
// ?: 简化双分支
$price = 1200;
if ($price > 1000) {
echo '太贵了';
} else {
echo '真便宜';
}
// 三元运算符
echo $price > 1000 ? '太贵了' : '真便宜';
echo '<hr>';
// ?? null合并运算符,返回表达式
// isset($a): 变量存在定义且值不为NULL, 才返回true
echo isset($password) ? $password : 'root';
// 如果$pass变量存在且值不为null,则使用该变量,否则创建该变量并设置默认值
// $password = '123';
$password = $password ?? 'root';
echo $password;
```
---
## 7. 错误屏蔽符
| 运算符 | 示例 | 描述 | 场景 |
| ------ | --------- | ---------------- | ------------ |
| `@` | `@(10/0)` | 屏蔽所有运行错误 | 线上生产环境 |
示例代码: `demo18.php`
```php
// @错误屏蔽符, 也叫 错误抑制符
// @只对表达式有效
// 实际开发中, 应该将这些错误写到日志文件中
// 变量未定义错误
echo @$username;
// INF: 无穷大
// echo @(10 / 0);
@(10 / 0);
// 语法错误等致命错误是无法屏蔽的
// @print_r($a)
@include('hello.php');
```