批改状态:合格
老师批语:目前能理解到这个层次, 基本够用
| 序号 | 运算符 | 示例 | 描述 |
|---|---|---|---|
| 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+版本
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# PHP中的运算符# 1. 算术运算符## 1.1. +, -, *, /: 加减乘除$x = 10;$y = 20;// 执行加法dumpbr($x + $y);// 执行减法dumpbr($x - $y);// 执行除法dumpbr($y / $x);// 执行乘法dumpbr($x * $y);/*执行结果:int(30)int(-10)int(2)int(200)*/## 1.2. %: 取模运算符, 即取余数.$x = 100;$y = 7;dumpbr($x % $y);/*100 / 7 = 14 ... 2执行结果:int(2)*/## 1.3. ++:自增;--:自减;$x = 20;$y = 10;/* 自增/自减的优先级大于加减乘除 *//* ++在变量后面, 则先参与执行表达式,再自增 */dumpbr($x + $y++);echobr('$y = ' . $y);/*20 + 10 = 30;$y = 10 + 1 = 11;执行结果:int(30)$y = 11*//* ++在变量前面, 则先自增, 再参与执行表达式 */$y = 10;dumpbr($x + ++$y);echobr('$y = ' . $y);/*$y = 10 + 1 = 11;20 + 11 = 31;执行结果:int(31)$y = 11*//* --跟++类似, 功能相反, 自减. 实例略 */
| 运算符 | 示例 | 描述 |
|---|---|---|
. |
$str1 . $str2 |
连接运算,返回连接之后的字符串 |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 2. . : 字符串连接/* test1:拼接字符串 */echobr('hello ' . 'php!');/*执行结果:hello php!*//* test2:拼接字符串和数字(隐式将数字转换为字符串) */$x = 20;$y = 10;/* 必须要用小括号把表达式括起来, 否则会报错 */$z = '$x + $y = ' . ($x + $y);echobr($z);/*执行结果:$x + $y = 30*//* test3:拼接数字和数字(两个都会被隐式转换为字符串) */$z = $x . $y;echobr($z);/*执行结果:2010*//* test4:拼接字符串和null(null被当做"") */$z = "hello" . null;echobr($z);/*执行结果:hello*/
| 序号 | 运算符 | 示例 | 描述 |
|---|---|---|---|
| 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'; |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 3. 赋值运算符## 3.1. = : 将表达式的值赋给变量. 略## 3.2. +=, -=, *=, /=, %= : 将变量的值加上(减去/乘以/除以/取余)表达式的值, 把所得的结果赋给变量./* test1: 以+=为例 */$x = 10;$x += 65535;echobr($x);/*等效于$x = $x + 65535 = 10 + 65535 = 65545;执行结果:65545*//* test2: 以%=为例 */$x = 50;$y = 7;$x %= $y;echobr($x);/*执行结果:1*/## 3.3. .= : 将变量的值转换成字符串, 后拼接表达式的值, 把所得的结果赋予给变量/* test1 */$x = 'hello ';$y = 'boys and girls';$x .= $y;echobr($x);/*执行结果:hello boys and girls*/
| 序号 | 运算符 | 示例 | 描述 |
|---|---|---|---|
| 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的整数 |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 4. 比较运算符## 4.1. >, >=, <, <= : 跟数学上的大于, 大于等于, 小于, 小于等于同义./* test1 */$x = 13;$y = 5;if ($x < $y) {echobr('变量$x的值比$y的值小');} else {echobr('变量x的值不小于$y的值');}/*执行结果:变量x的值不小于$y的值*/## 4.2. ==:判断左右两边的值是否相等;===:同时判断左右两边的值和数据类型是否相等, 值和数据类型都相等, 才返回true.$x = 100;$y = '100';$z = '100';/* test1: */if ($x == $y) {echobr('变量$x的值和变量$y的值在数值上相等');} else {echobr('变量$x的值和变量$y的值在数值上不相等');}/*执行结果:变量$x的值和变量$y的值在数值上相等*//* test2: */if ($x === $y) {echobr('变量$x的值和变量$y的值在数值上和数据类型上都相等');} else {echobr('变量$x的值和变量$y的值在数据类型上不相等或数值上和数据类型上均不相等');}/*执行结果:变量$x的值和变量$y的值在数据类型上不相等或数值上和数据类型上均不相等*//* test3 */$x = null;$y = 'null';$z = 'NuLl';dumpbr($x == $y);dumpbr($x === $y);dumpbr($y == $z);/*测试结果: 1:null值和"null"字符串值不相等; 2: 字符串值比较区分大小写;执行结果:bool(false)bool(false)bool(false)*/// !=(值不相等), !==(值和类型补全等)的使用方法类似, 例子略.## 4.3. <=> : 太空船运算符, PHP7.0+才支持, 左边的值大于右边的值, 返回正数(1); 左边的数值小于右边的数值, 返回负数(-1); 左右相等, 返回0./* 使用场景: 当双方比较的各种结果分别执行不同的业务逻辑时使用 */$temperature = 20;$zero = 0;$result = $temperature <=> $zero;$status = '';switch ($result) {case 1:$status = $temperature . '摄氏度的水的状态是液体';break;case 0:$status = $temperature . '摄氏度的水的状态是冰水混合物';break;case -1:$status = $temperature . '摄氏度的水的状态是固态';break;default:}echobr($status);/*执行结果:20摄氏度的水的状态是液体*/
| 序号 | 运算符 | 示例 | 描述 | ||||
|---|---|---|---|---|---|---|---|
| 1 | && |
$a && $b |
逻辑与 | ||||
| 2 | ` | ` | `$a | $b` | 逻辑或 | ||
| 3 | ! |
!$a |
逻辑非 | ||||
| 4 | xor |
$a xor $b |
逻辑异或 |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 5. 逻辑运算符## 5.1. &&: 与运算, && 左右两边的表达式都返回true时, 与运算的值才返回true;否则, 返回false./* 逻辑运算符的优先级小于比较运算符. *//* 如果左边的表达式就返回false, 则直接返回false, 不计算右边的表达式的值了. *//* test1: */dumpbr(3 < 4 && 5 > 8);/*执行结果:bool(false)*//* test2: */$array;dumpbr(isset($array) && count($array) > 0);/*执行isset($array)表达式的值是false, 直接返回. count($array)未执行, 所以不会报错执行结果:bool(false)*/## 5.2. ||: 或运算, || 左右两边的表达式都返回false时, 或运算的值才返回false;否则, 返回true./* 如果左边的表达式返回true, 则直接返回true, 不计算右边表达式的值了. */dumpbr(null == "null" || "null" == "nUlL");/*运行结果:bool(true)*/## 5.3. !: 非运算. 即布尔值取反.// 举例(略)
| 序号 | 运算符 | 示例 | 描述 | 场景 |
|---|---|---|---|---|
| 1 | ?: |
$a ?: $b |
仅判断表达式true/false |
简化双分支 |
| 2 | ?? |
$a ?? $b |
判断变量存在且不为 null |
设置默认值 |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 6. 三元运算符## 6.1. ?: 三元运算符, 类似: if(判断){return 表达式1} else {return 表达式2}$age = 20;$status = ($age >= 18) ? '成年人' : '未成年人';echobr($age . '岁的人是' . $status);/*执行结果:20岁的人是成年人*/## 6.2. ?? 判断变量存在且不为 null, 否则为其设置默认值.$username = $GET['username'] ?? 'admin';echobr($username);/*当请求路径包括: ?username=zhangsan, 则打印结果为:zhangsan执行结果:admin*/
| 运算符 | 示例 | 描述 | 场景 |
|---|---|---|---|
@ |
@(10/0) |
屏蔽所有运行错误 | 线上生产环境 |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}## 7. 错误屏蔽符/* 使用场景: 防止敏感信息泄露, 如sql语句, 数据库链接的用户名,密码等 */// $username未定义, 直接echo会报错, 加了@, 异常照旧, 但不报错echo @$username;/*不加@, 浏览器会输出异常信息, 加了之后, 就不输出了.*/// 语法错误不能被@忽略@defin('CONSTANT1', '我是一个常量');/*照样报错*/
| 序号 | 类型 | 语法 | 模板语法 |
|---|---|---|---|
| 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; |
运行demo:
<?php# 流程控制function echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 1. 分支结构## 1.1. 单分支/* 单分支只有if, 没有else/elseif *//* test1: */$current = 10;$time = 8;if ($current > $time) {echobr('现在已经' . $current . '点了, 上班时间是' . $time . '点, 你迟到了');}/*执行结果:现在已经10点了, 上班时间是8点, 你迟到了*//* 当代码体中只有一行代码时, 花括号可以省略 */if ($current > $time)echobr('现在已经' . $current . '点了, 上班时间是' . $time . '点, 你迟到了');/*执行结果:现在已经10点了, 上班时间是8点, 你迟到了*//* 单分支的替代语法 */if ($current > $time) :echobr('现在已经' . $current . '点了, 上班时间是' . $time . '点, 你迟到了');endif;/*执行结果:现在已经10点了, 上班时间是8点, 你迟到了*/## 1.2. 双分支/* 有if,有else *//* test1: */$current = 7.20;$time = 8;if ($current > $time) {echobr('现在已经' . $current . '点了, 上班时间是' . $time . '点, 你迟到了');} else {echobr('打卡成功, 按时上班.');}/*执行结果:打卡成功, 按时上班.*//* 双分支的替代语法: */if ($current > $time) :echobr('现在已经' . $current . '点了, 上班时间是' . $time . '点, 你迟到了');else :echobr('打卡成功, 按时上班.');endif;/*执行结果:打卡成功, 按时上班.*/## 1.3. 多分支/* if...elseif...[elseif...]else... */$temperature = -20;$zero = 0;$result = $temperature <=> $zero;if ($result > 0) {echobr('当前水的温度为' . $temperature . '摄氏度, 形态为液态.');} elseif ($result == 0) {echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰水混合物.');} else {echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰块.');}/*执行结果:当前水的温度为-20摄氏度, 形态为冰块.*//* 多分支语句的替代语法: */$temperature = 20;$zero = 0;$result = $temperature <=> $zero;if ($result > 0) :echobr('当前水的温度为' . $temperature . '摄氏度, 形态为液态.');elseif ($result == 0) :echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰水混合物.');else :echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰块.');endif;/*执行结果:当前水的温度为20摄氏度, 形态为液态.*/## 1.4. 使用switch简化多分支$temperature = 0;$zero = 0;$result = $temperature <=> $zero;switch ($result) {case 1:echobr('当前水的温度为' . $temperature . '摄氏度, 形态为液态.');break;case 0:echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰水混合物.');break;default:echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰块.');}/*执行结果:当前水的温度为0摄氏度, 形态为冰水混合物.*//* switch语句的替代语法 */$temperature = 15;$zero = 0;$result = $temperature <=> $zero;switch ($result):case 1:echobr('当前水的温度为' . $temperature . '摄氏度, 形态为液态.');break;case 0:echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰水混合物.');break;default:echobr('当前水的温度为' . $temperature . '摄氏度, 形态为冰块.');endswitch;/*执行结果:当前水的温度为15摄氏度, 形态为液态.*/
| 序号 | 类型 | 语法 | 模板语法 |
|---|---|---|---|
| 1 | 入口判断型 | while(){...} |
while(): ... endwhile; |
| 2 | 出口判断型 | do {...} while(); |
do : ... while(); |
| 3 | 计数型 | for(){...} |
for () : ... endfor; |
运行demo:
<?php# 循环控制function echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# tips:遍历数组的一种方法$team = ['张三', '李四', '王五', '赵六', '钱七', '孙八'];/* 1.使用current($array)获取当前数组元素值 *//* 2.跳到下一个元素:next($array) *//* 3.重置数组元素指针指向第一个元素: reset($array) */# 1. 入口判断型/* while() {...} *//* test1: */while ($teammate = current($team)) {echobr($teammate);next($team);}/*执行结果:张三李四王五赵六钱七孙八*//* while语句替代语法 */reset($team);while ($teammate = current($team)) :echobr($teammate);next($team);endwhile;/*执行结果:张三李四王五赵六钱七孙八*/# 2. 出口型判断/* do {...} while(...) */reset($team);do {$teammate = current($team);echobr($teamate);next($team);} while ($teammate = current($team));/* 出口型没有替代语法 */# 3. 计数型/* for循环 *//* test1: 循环生成学号 */$stuCount = 10;$stuNumber = [];$prefix = 'NO.';for ($index = 0; $index < $stuCount; $index++) {$stuNumber[] = $prefix . ($index + 1);}echo '<pre>';dumpbr($stuNumber);echo '</pre>';/*执行结果:array(10) {[0]=>string(4) "NO.1"[1]=>string(4) "NO.2"[2]=>string(4) "NO.3"[3]=>string(4) "NO.4"[4]=>string(4) "NO.5"[5]=>string(4) "NO.6"[6]=>string(4) "NO.7"[7]=>string(4) "NO.8"[8]=>string(4) "NO.9"[9]=>string(5) "NO.10"}*//* for循环的替代语法 *//* 循环打印出所有学生学号 */for ($index = 0; $index < count($stuNumber); $index++) :echobr($stuNumber[$index]);endfor;/*执行结果:NO.1NO.2NO.3NO.4NO.5NO.6NO.7NO.8NO.9NO.10*/
循环控制关键字:
| 序号 | 关键字 | 描述 |
|---|---|---|
| 1 | continue |
终止本次循环,提前进入下一轮 |
| 2 | break |
跳出本层循环 |
运行demo:
<?phpfunction echobr($param = ''){echo $param . '<br>';}function dumpbr($param = ''){var_dump($param);echo '<br>';}# 4. 两个循环中用到的关键字## 4.1. continue: 结束本次循环, 提前进入下一次循环$stuNumber[4] = null;$stuNumber[7] = false;for ($index = 0; $index < count($stuNumber); $index++) {// 不打印false/null值if (!$stuNumber[$index]) {echobr('第' . ($index + 1) . '个学生退学了, 学号注销');continue;}echobr('第' . ($index + 1) . '个学生的学号是:' . $stuNumber[$index]);}/*执行结果:第1个学生的学号是:NO.1第2个学生的学号是:NO.2第3个学生的学号是:NO.3第4个学生的学号是:NO.4第5个学生退学了, 学号注销第6个学生的学号是:NO.6第7个学生的学号是:NO.7第8个学生退学了, 学号注销第9个学生的学号是:NO.9第10个学生的学号是:NO.10*/## 4.2. break: 结束本层循环.$progress = [100, 100, 100, 100, 1000, 100, 100, 100];$maxNumber = 200;echobr('共有' . count($progress) . '个步骤');for ($index = 0; $index < count($progress); $index++) {if ($progress[$index] > $maxNumber) {echobr('有内鬼, 终止交易');break;}echobr('步骤' . ($index + 1) . '一切正常');}/*执行结果:共有8个步骤步骤1一切正常步骤2一切正常步骤3一切正常步骤4一切正常有内鬼, 终止交易*/
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号