Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:目前能理解到这个层次, 基本够用
序号 | 运算符 | 示例 | 描述 |
---|---|---|---|
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+
版本
<?php
function 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:
<?php
function 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:
<?php
function 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:
<?php
function 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:
<?php
function 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:
<?php
function 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:
<?php
function 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.1
NO.2
NO.3
NO.4
NO.5
NO.6
NO.7
NO.8
NO.9
NO.10
*/
循环控制关键字:
序号 | 关键字 | 描述 |
---|---|---|
1 | continue |
终止本次循环,提前进入下一轮 |
2 | break |
跳出本层循环 |
运行demo:
<?php
function 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一切正常
有内鬼, 终止交易
*/