主要内容:
- 常用运算符
- 短路求知、三元表达式
- 分支结构与模板语法
- 循环与模板语法
- 表查询示例
1. 常用运算符
1-1. 比较运算符:返回布尔值
- “==”, “===”
- “==”: 值比较,当操作符二边的操作数类型不一致,会触发类型自动转换机制
- “===”:除了值相等, 类型也必须一致
var_dump(10 > 20);
var_dump(100 == '100');
//返回true
var_dump(100 === '100');
//返回false,因为要求类型必须一致。
1-2. 太空船运算符
- 谁大显示谁,相当于在前后比较。例如第一个显示-1,第二个显示1,第三个显示0。
var_dump(10 <=> 20);
var_dump(10 <=> 5);
var_dump(10 <=> 10);
1-3. 逻辑运算符
- &&:二边表达式除非全部为true,否则返回false
- ||: 二边表达式只要有一个为true,则返回true
var_dump((10 > 20) && (5 > 8));
var_dump((10 < 20) || (5 > 8));
var_dump(true || false);
2. 短路求值、三元表达式
2-1. 短路求值
- 如果第一个表达式(isset($username)) 为false, 则直接执行else分支,不会再去计算” $username === ‘admin’”
$username = 'peter';
if ($username && $username === 'admin')
echo '欢迎您';
else
echo '您未登录,请先登录';
echo '<hr>';
2-2. 三元表达式
- 用三元运算符来简单双分支
- 三元: 指有三个表达式, 意味要有二个操作符( ? : 以及更为简化的? ?)
$price = 2000;
if ($price > 1500) echo '太贵了';
else echo '太便宜了';
// 可写成:下面这种方式
$price = 1000;
echo $price > 1500 ? '太贵了' : '太便宜了';
echo '<hr>';
// root, 密码:默认就是 root
$password = sha1('123456');
echo isset($password) ? $password : 'root';
echo '<hr>';
// isset() + 三元运算 = 变量默认值
// $password = '123456';
// 进一步简化为??
// ?? : null合并运算符
unset($password);
echo $password ?? 'root';
3. 分支结构与模板语法
- if else; switch case break
3-1. 单分支
$amount = 4500;
// 实际支付的金额,默认值是不打折的金额
$payment = $amount;
// if ($amount >= 5000) {
// 当流程控制语句中只有一行代码的时候,可以省略大括号
// $payment = $amount * 0.9;
// }
// if ($amount >= 5000) $payment = $amount * 0.9;
- 模板语法:去掉流程控制中的大括号
- 将起始大括号用冒号代替,将结束大括号用特殊关键字代替
if ($amount >= 5000) :
// 当流程控制语句中只有一行代码的时候,可以省略大括号
$payment = $amount * 0.9;
endif;
if ($amount >= 5000) : $payment = $amount * 0.9; endif;
echo '实际支付: ' , $payment , '<br>';
echo '<hr>';
3-2. 双分支
$amount = 4500;
if ($amount >= 5000) {
$payment = $amount * 0.9;
} else {
$payment = $amount;
}
$amount = 7500;
if ($amount >= 5000) :
$payment = $amount * 0.9;
else :
$payment = $amount;
endif;
echo '实际支付: ' , $payment , '<br>';
echo '<hr>';
3-3. 多分支
$amount = 22500;
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>';
echo '<hr>';
3-4. switch:简化多分支
// switch (表达式) {
// case 条件1:
// 分支语句...
// break;
// case ...
// default:
// ....
// }
// 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;
$amount = 3500;
switch (true) {
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
break;
case $amount >= 10000 && $amount < 20000 :
$payment = $amount * 0.7;
break;
case $amount >= 20000 :
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
}
echo '实际支付: ' , $payment , '<br>';
echo '<hr>';
// switch:通常用在单值判断中
$discount = 0.9;
$amount = 13500;
// switch ($discount) {
// case 0.7:
// $payment = $amount * 0.7;
// break;
// case 0.8:
// $payment = $amount * 0.8;
// break;
// case 0.9:
// $payment = $amount * 0.9;
// break;
// default:
// die('不支持的折扣率');
// }
// 模板语法
switch ($discount) :
case 0.7:
$payment = $amount * 0.7;
break;
case 0.8:
$payment = $amount * 0.8;
break;
case 0.9:
$payment = $amount * 0.9;
break;
default:
die('不支持的折扣率');
endswitch;
echo '实际支付: ' , $payment , '<br>';
echo '<hr>';
4. 循环与模板语法
4-1. 判断型循环-入口判断型
error_reporting(E_ALL);
$cities = ['合肥', '南京', '杭州', '苏州', '上海'];
// 获取当前数组元素的值,先是很笨的办法
echo current($cities);
next($cities);
echo current($cities);
next($cities);
echo current($cities);
next($cities);
echo current($cities);
next($cities);
echo current($cities);
next($cities);
echo current($cities);
// while:进入循环代码之前进行判断,只有条件为真才执行循环体
while ($city = current($cities)) {
echo $city, '<br>';
// 前移指针
next($cities);
}
// 数组指针复位,重新指向第一个
reset($cities);
while ($city = current($cities)) {
echo $city, '<br>';
next($cities);
}
// 模板语法
reset($cities);
while ($city = current($cities)) :
echo $city, '<br>';
next($cities);
endwhile;
4-2. 判断型循环-出口判断型
reset($cities);
do {
echo $city, '<br>';
// 循环体内必须要有更新循环条件的语句,否则进入死循环,
next($cities);
} while ($city = current($cities));
// do - while 没有对应的模板语法
4-3. 计数型循环
- for (循环变量的初始化; 循环条件; 更新循环条件){….}
// 遍历数组
echo count($cities);
// $i:数组元素的索引,默认从0开始
for ($i = 0; $i < count($cities); $i++) {
echo $cities[$i], '<br>';
}
// 模板语法
for ($i = 0; $i < count($cities); $i++) :
// 输出拦截, break: 提前终止循环
if ($i > 2) break;
// 有选择性的输出, 跳过一部分元素
if ($i === 3 || $i === 2) continue;
echo $cities[$i], '<br>';
endfor;
5. 表查询示例
- 将php查询出来的二维数组,用小单元的php插入到一个表格中。
<?php
// 数据表查询结果通常是一个二维数组,用二维数组来模拟
$users = [
['id'=>1, 'name'=>'zhu', 'grade'=> 60],
['id'=>2, 'name'=>'admin', 'grade'=> 50],
['id'=>3, 'name'=>'peter', 'grade'=> 20],
];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo 'Hello' ?></title>
</head>
<body>
<table border="1">
<?php for ($i = 0; $i < count($users); $i++) : ?>
<tr>
<td><?php echo $users[$i]['id'] ?></td>
<td><?php echo $users[$i]['name'] ?></td>
<td><?php echo $users[$i]['grade'] ?></td>
</tr>
<?php endfor ?>
</table>
</body>
</html>
6. 自己的实战
6-1. 分支结构(if、switch)
$inputnum = 6;
if ($inputnum > 4 and $inputnum < 7):
echo 'You should go to kindergarden.';
elseif ($inputnum > 5 and $inputnum < 11 ):
echo 'You could go to primary school.';
elseif ($inputnum > 10 and $inputnum < 19):
echo 'you could go to high school.';
elseif ($inputnum > 18):
echo 'you could go to college.';
else:
echo 'You should go home now.';
endif;
echo '<hr>';
switch ($inputnum) {
case '1':
echo 'You should go home now.';
break;
case ($inputnum > 4 and $inputnum < 7):
echo 'You should go to kindergarden.';
break;
case ($inputnum > 18):
echo 'you could go to college.';
break;
case '1':
echo 'You should go home now.';
break;
default:
echo 'Good boy!';
break;
6-2. 循环结构(while、for)
$schoolName = array('kindergarden', 'primary school', 'high school', 'university');
echo $schoolName[0];
echo '<hr>';
reset($schoolName);
while ($school = current($schoolName)) {
echo $school, '<br>';
next($schoolName);
}
echo '<hr>';
for ($i=0; $i < count($schoolName); $i++) {
echo $schoolName[$i], '<br>';
}
echo '<hr>';
for ($i=0; $i < count($schoolName); $i++):
echo $schoolName[$i], '<br>';
endfor;