运算符
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
var_dump(15+6);
var_dump(15-6);
var_dump(15*6);
var_dump(15/6);
var_dump(15%6);
var_dump($n++);
var_dump($n);
$n = $n + 1;
var_dump($n--);
var_dump(--$n);
var_dump($n);
//. 字符串连接
echo 'a' . 'b' . '<br>';
echo 'abc' . 28 . '<br>';
$n = $n + 10;
$n *= 10;
$n =$n *10;
var_dump($n);// $n = $n + 10;
$n *= 10;
// $n =$n *10;
var_dump($n);
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+ |
var_dump(10 > 20);
// 是否相等==, 是否全等===
// ==: 只判断值是否相等, 不判断类型
// 当==二边的类型不同时,会发生类型的自动转换
// var_dump(10 == (int)'10');
// === 全等, 不仅值要相等, 类型也要相等
var_dump(10 === '10');
echo '<hr>';
// 太空船 <=> 太空船返回的是布尔值类型
var_dump(10 <=> 20);
// -1 < 0, 说明 10 小于 20
var_dump(10 <=> 5);
// 1 > 0, 说明 10 大于 5
var_dump(10 <=> 10);
// 0, 说明 相等
- 比较运算符: 返回布尔值,常用于流程控制中(
if/while/for...
) <=>
: 也叫组合比较符, 例如$a <=> $b
, 有三种返回结果
序号 |
运算 |
结果 |
1 |
$a > $b |
返回>0 的整数 |
2 |
$a < $b |
返回<0 的整数 |
3 |
$a = $b |
返回=0 的整数 |
5. 逻辑运算符
序号 |
运算符 |
示例 |
描述 |
1 |
&& |
$a && $b |
逻辑与 |
2 |
` |
|
` |
`$a |
|
$b` |
逻辑或 |
3 |
! |
!$a |
逻辑非 |
4 |
xor |
$a xor $b |
逻辑异或 |
// && 理解为乘法, true==>1, false==>0
var_dump((3<4) && 5>8);
// var_dump(true && false);
// && 理解为加法, true==>1, false==>0
var_dump((3<4) || 5>8);
// var_dump(true || false);
// $name = 'peter';
// $name = 'admin';
if (@$name && $name==='admin') {
echo '欢迎您';
} else {
echo '未登录';
}
echo '<hr>';
6. 三元运算符
- ?? null合并运算符 省去了 isset()函数
序号 |
运算符 |
示例 |
描述 |
场景 |
1 |
?: |
$a ?: $b |
仅判断表达式true/false |
简化双分支 |
2 |
?? |
$a ?? $b |
判断变量存在且不为 null |
设置默认值 |
$price = 900;
if ($price > 1000) echo '太贵了'; else echo '真便宜';
// 条件 ? true : false
echo $price > 1000 ? '太贵了' : '真便宜';
echo '<hr>';
// ?? null合并运算符
// 设置变量默认值
$password = '123abc';
// $password = isset($password) ? $password : 'root';
$password = $password ?? 'root';
echo $password;
7. 错误屏蔽符
运算符 |
示例 |
描述 |
场景 |
@ |
@(10/0) |
屏蔽所有运行错误 |
线上生产环境 |
流程控制
1. 分支结构
序号 |
类型 |
语法 |
模板语法 |
1 |
单分支 |
if(){...} |
if(): ... endif; |
2 |
双分支 |
if(){...} else {...} |
if(): ... else: ... endif; |
3 |
多分支 |
if(){...} elseif {...} else {...} |
if(): ... elseif: ... else: ... endif; |
4 |
switch |
switch() {case: ... break...} |
switch(): ...endswitch; |
1.单分支
// 购买金额
$amount = 5500;
// 实际支付
$payment = $amount;
if ($amount > 5000) {
$payment = $amount * 0.9;
}
如果代码体只有一行,可以省略大括号
if ($amount > 5000) $payment = $amount * 0.9;
有一种替代语法 : 模板语法, 用在与html代码混编的时候
模板语法的目标是: 干掉大括号
if ($amount > 5000) :
$payment = $amount * 0.8;
endif;
echo '实际支付: ' . $payment . '<br>';
2. 双分支
$amount = 3500;
if ($amount > 5000) {
$payment = $amount * 0.9;
} else {
$payment = $amount;
}
// 双分支模板语法
if ($amount > 5000) :
$payment = $amount * 0.9;
else :
$payment = $amount;
endif;
echo '实际支付: ' . $payment . '<br>';
3.多分支
$amount = 8500;
// if ($amount > 5000 && $amount < 10000) {
// $payment = $amount * 0.9;
// } elseif ($amount >= 10000 && $amount < 20000) {
// $payment = $amount * 0.7;
// } elseif ($amount >= 20000) {
// $payment = $amount * 0.5;
// } else {
// $payment = $amount;
// }
// 模板语法
if ($amount > 5000 && $amount < 10000) :
$payment = $amount * 0.9;
elseif ($amount >= 10000 && $amount < 20000) :
$payment = $amount * 0.7;
elseif ($amount >= 20000) :
$payment = $amount * 0.5;
else :
$payment = $amount;
endif;
echo '实际支付: ' . $payment . '<br>';
4. switch: 简化多分支
- case是判断条件 break是跳出当前分支 default是 最后选择
$amount = 2300;
switch (true) {
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
// break: 跳出当前分支
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount * 0.7;
break;
case $amount >= 20000:
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
}
// 模板语法
switch (true) :
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
// break: 跳出当前分支
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount * 0.7;
break;
case $amount >= 20000:
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
endswitch;
echo '实际支付: ' . $payment . '<br>';
echo '<hr>';
// switch 更常用的场景是单值判断
$discount = 0.6;
$amount = 10000;
switch ($discount):
case 0.9:
$payment = $amount * 0.9;
break;
case 0.8:
$payment = $amount * 0.8;
break;
default:
die('不支持的折扣率');
endswitch;
echo '实际支付: ' . $payment . ', 折扣率: '. $discount;
2. 循环结构
序号 |
类型 |
语法 |
模板语法 |
1 |
入口判断型 |
while(){...} |
while(): ... endwhile; |
2 |
出口判断型 |
do {...} while(); |
do : ... while(); |
3 |
计数型 |
for(){...} |
for () : ... endfor; |
序号 |
关键字 |
描述 |
1 |
continue |
终止本次循环,提前进入下一轮 |
2 |
break |
跳出本层循环 |
入口判断型/while循环
- current()//每个数组中都有一个内部的指针指向它的”当前”元素,初始指向插入到数组中的第一个元素。简单理解为开启指针
- next()//指针指向下一个
- prev()//指针指向上一个
$cities = ['武汉', '合肥', '南京', '杭州', '上海'];
// 1. 入口判断型
echo current($cities);
next($cities);
echo current($cities);
next($cities);
echo current($cities);
echo '<hr>';
reset($cities);
// $city = current($cities): 循环条件
// while ($city = current($cities)) {
// echo $city . '<br>';
// // 更新循环条件, 没有这个语句, 会进入死循环
// next($cities);
// }
// reset($cities);
// 模板语法
while ($city = current($cities)) :
echo $city . '<br>';
// 更新循环条件, 没有这个语句, 会进入死循环
next($cities);
endwhile;
echo '<hr>';
2. 出口判断型 /do..while
echo '数组中有 : ' . count($cities);
echo '<hr>';
// $i = 0;循环变量初始化
// $i < count($cities): 循环条件
// $i++: 更新循环条件
for ($i = 0; $i < count($cities); $i++) {
// echo $cities[$i] . '<br>';
}
// 模板语法
for ($i = 0; $i < count($cities); $i++) :
// echo $cities[$i] . '<br>';
endfor;
echo '<hr>';
reset($cities);
// continue: 终止当前循环,提前进入下一轮
$cities = ['武汉', '合肥', false, '南京', null, '杭州', '上海'];
// while ($city = current($cities)) :
// echo $city . '<br>';
// next($cities);
// endwhile;
for ($i = 0; $i < count($cities); $i++) :
// 跳过空数据
if (!$cities[$i]) continue;
echo $cities[$i] . '<br>';
// break; 跳出本层
if ($cities[$i] === '杭州') break;
endfor;