# 運算符
[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');
```