运算符、流程控制、循环与文件包含
[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+
版本
printf('5 模 3 = %d <br>', (5 % 3));
//判断是否闰年
$year = date('Y');
// echo $year;
//闰年:能被4整除,但是不能被100整除
if ($year % 4 === 0 && $year % 100 !== 0) {
printf('%d 年是闰年<br>', $year);
} else {
printf('%d 年不是闰年<br>', $year);
}
//随机数 10位的随机数
echo mt_rand(), '<br>';
//随机数 10位的随机数
// echo mt_rand() % 100, '<br>';
// 产生一个1到99的随机数
echo mt_rand(1, 99);
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 /= $b |
$a = $a / 10; |
6 | %= |
$a %= 10 |
$a = $a % 10; |
7 | .= |
$a .= 'a' |
$a = $a . 'a' |
// 赋值
$a = 1;
$b = 2;
// $a = $a + $b;
//等价
$a += $b;
echo '$a += $b => ', $a, '<br> ';
// $a = $a - $b;
//等价
$a -= $b;
echo '$a -= $b => ', $a, '<br> ';
// $a = $a * $b;
//等价
$a *= $b;
echo '$a *= $b => ', $a, '<br> ';
// $a = $a / $b;
//等价
$a /= $b;
echo '$a /= $b => ', $a, '<br> ';
// .= :字符串拼装
$str = 'php';
$str .= '.cn';
echo $str;
$list = '<ul>';
$list .= '<li>item1</li>';
$list .= '<li>item2</li>';
$list .= '<li>item3</li>';
$list .= '</ul>';
echo $list;
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 的整数 |
// 比较,返回值是boolean
var_dump(100 > 80);
echo '<hr>';
// "==": 只要求值相等就是true,如果两边类型不同则自动转换
var_export(100 == '100');
echo '<br>';
var_export(100 == (int)'100');
echo '<br>';
var_export((string)100 == '100');
echo '<br>';
// "===": 要求值,类型全相同才返回true
var_export(100 === '100');
echo '<br>';
var_export(100 === (int)'100');
echo '<br>';
$a = 25;
$b = 15;
// if ($a < $b) {
// echo '-1 <br>';
// } elseif ($a > $b) {
// echo '1 <br>';
// } else {
// echo '0 <br>';
// }
// 等价于
echo $a <=> $b;
//逻辑
// 与 &&:符号两边必须都为true,否则false
// || :符号两边只要有一个为true,返回true,两边都是false才是false
// 要求两边的操作数都是bool,如果不是就手动干预
echo '<br>';
var_dump(false && true);
//第一个false 第二个条件不会判断,短路求值,后面的&&true永不执行
echo '<br>';
var_dump(true && false);
echo '<br>';
var_dump(false || true);
echo '<br>';
var_dump(!false, !true);
$userName = 'admin';
if (isset($userName) && $userName === 'admin') {
echo '欢迎管理员' . $userName . '<br>';
} else {
echo '请登录 <br>';
}
if (!isset($email)) {
echo '没有输入邮箱';
}
// 三元运算与null合并运算符
$score = 90;
if ($score >= 60) {
echo '合格';
} else {
echo '补考';
}
echo '<br>';
// 三元运算符
echo $score >= 60 ? '合格' : '补考';
//检测页码
echo '<br>';
// echo 'p = ' . $_GET['p'];
// $page = isset($_GET['p']) ? $_GET['p'] : 1;
// echo 'p = ' . $page;
//简化
//null 合并运算符,给变量一个默认值,用在表单中
$page = $_GET['p'] ?? 1;
echo 'p = ' . $page, '<hr>';
?>
<!-- 粘性表单 -->
<input type="text" value="<?= $_GET['p'] ?? 1 ?>">
5. 字符串插值
//字符串插值
$name = '电脑';
$price = 6699;
//之前
echo '品名:' . $name . '<br> 价格:' . $price . '元<br>';
// 单引号与双引号定义的字符串是有区别的
// 双引号中的字符串更像是一个模板
// 这个模板中除了字面量之外,还可以有“变量”和“转义序列”
// \n :换行;\r:回车;\t:tab,\\,\$:输出$符号
// 变量需要一个边界符{} 一对大括号
$template = "品名: {$name} \n 价格: {$price} 元 \n";
echo $template, '<br>';
//换行在html中就一个空格
// nl2br()在\n前自动插入<br>
$template = nl2br("品名: {$name} \n 价格: {$price} 元 \n");
echo $template, '<br>';
// 2. heredoc:双引号字符串的替代语法
// 比较适合输出大量的多行的内部存在变量的html代码
// $table = <<< "SHOW"
// <table border="1" width="200">
// <tr><th>品名</th><td>{$name}</td></tr>
// <tr><th>价格</th><td>{$price}</td></tr>
// </table>
// SHOW;
$table = <<< SHOW
<table border="1" width="200">
<tr><th>品名</th><td>{$name}</td></tr>
<tr><th>价格</th><td>{$price}</td></tr>
</table>
SHOW;
//SHOW: 必须要写到第一列,必须要与起始名称一致
echo $table;
echo '<hr>';
// 3. nowdoc:单引号的替代语法
$table = <<< 'SHOW'
<table border="1" width="200">
<tr><th>品名</th><td>手机</td></tr>
<tr><th>价格</th><td>3699</td></tr>
</table>
SHOW;
//SHOW: 必须要写到第一列,必须要与起始名称一致
echo $table;
// nowdoc:适合大段的多行的字符串字面量的输出
echo '<hr>';
6. 流程控制
// 流程控制:分支
// 1. 单分支
$score = 70;
if ($score >= 60) {
echo '恭喜,成功上岸<br>';
}
// 替代语法
// 目标是干掉大括号
if ($score >= 60) :
echo '恭喜,成功上岸<br>';
endif;
echo '<hr>';
// 双分支
$score = 70;
if ($score >= 60) {
echo '恭喜,成功上岸<br>';
} else {
echo '差一点就过了,补考吧<br>';
}
//替代语法
$score = 70;
if ($score >= 60) :
echo '恭喜,成功上岸<br>';
else :
echo '差一点就过了,补考吧<br>';
endif;
// 简化语法:三元
echo $score >= 60 ? '恭喜,成功上岸<br>' : '差一点就过了,补考吧<br>';
// 多分支
$score = 75;
if ($score >= 60 && $score < 70) {
echo '恭喜,成功上岸<br>';
} elseif ($score >= 70) {
echo '优秀,加油 <br>';
} else {
echo '差一点就过了,补考吧<br>';
}
// 替代语法
$score = 75;
if ($score >= 60 && $score < 70) :
echo '恭喜,成功上岸<br>';
elseif ($score >= 70) :
echo '优秀,加油<br>';
else :
echo '差一点就过了,补考吧<br>';
endif;
// 4. switch, 多分支的简化方案
echo '<hr>';
switch ($score) {
case $score >= 60 && $score < 70:
echo '恭喜,成功上岸<br>';
break;
case $score >= 70:
echo '优秀,加油<br>';
break;
default:
echo '差一点就过了,补考吧<br>';
}
//替代语法
switch ($score):
case $score >= 60 && $score < 70:
echo '恭喜,成功上岸<br>';
break;
case $score >= 70:
echo '优秀,加油<br>';
break;
default:
echo '差一点就过了,补考吧<br>';
endswitch;
// switch 更多用在单值判断
// switch ($_GET['action'] ?? 1):
// case 'insert':
// echo '<script>alert("新增成功")</script>';
// break;
// case 'update':
// echo '<script>alert("更新成功")</script>';
// break;
// case 'delete':
// echo '<script>alert("删除成功")</script>';
// break;
// default:
// echo '<script>alert("非法操作")</script>';
// endswitch;
模板写法
<hr color="red">
<?php $score = 75 ?>
<?php if ($score >= 60 && $score < 70) : ?>
<p>恭喜,成功上岸 </p>
<?php elseif ($score >= 70) : ?>
<p>优秀,加油</p>
<?php else : ?>
<p>差一点就过了,补考吧</p>
<?php endif ?>
7. 循环结构
// 三要素
// 1. 循环条件的初始值
// 2. 循环条件
// 3. 更新循环条件 (步长)
$courses = ['数学', '语文', '英语', '道法', '美术'];
// 数组的长度
// echo count($courses);
// 1. 条件循环
// 1.1 入口判断型 while(){}
// 1. 循环条件的初始值
// $i 是要遍历的数组的索引,默认从0开始
$i = 0;
// 2. 循环条件
// while ($i < count($courses)) {
// echo $courses[$i], '<br>';
// // 3. 更新循环条件
// $i++;
// }
//替代语法
while ($i < count($courses)) :
echo $courses[$i], '<br>';
// 3. 更新循环条件
$i++;
endwhile;
echo '<hr>';
// 1.2 出口判断型 do {} while ()
// 当条件为false至少执行一次
$i = 0;
do {
echo $courses[$i], '<br>';
$i++;
} while ($i > count($courses));
echo '<hr>';
// 2. 计算式, for
//for() 可以视为while的简化
// for(初始条件;循环条件;更新条件)
// for ($i = 0; $i < count($courses); $i++) {
// echo $course[$i], '<br>';
// }
for ($i = 0; $i < count($courses); $i++) :
echo $courses[$i], '<br>';
endfor;
echo '<hr color="red">';
// 3. 提前终止循环
// 3.1 提前终止本轮循环,进入到下一轮
// 3.2 直接退出循环
// for ($i = 0; $i < count($course); $i++) {
// // 跳过英语
// if ($i === 2) continue;
// //只输出前2个
// if ($i > 2) break;
// echo $course[$i], '<br>';
// }
// echo '<hr>';
// 遍历数组
foreach ($courses as $i => $course) {
if ($i === 2) {
continue;
}
echo $course, '<br>';
};
echo '<hr color="green">';
//替代语法
foreach ($courses as $i => $course) :
if ($i === 2) continue;
echo $course, '<br>';
endforeach;
8. 文件包含
本质上在当前脚本插入一个php结束标记,进入html模式
include
// include:将一个外部的文件插入到当前的代码块中
$name = 'TJ';
function hello($name)
{
echo 'Hello ' . $name;
}
include 'hello.inc.php';
// 当include时,当前会自动插入一个结束标记,进入到html模式
// 被插入的脚本 可以访问当前作用域中的所有成员
include 'test.inc.html';
// include是在运行阶段包含,所以可以用在if中
// 条件包含
if (true) {
// include 'hello.inc.php';
require 'hello.inc.php';
} else {
echo '没有包进来';
}
require
可以理解为 require === include + exit;
include_once ,只包含一次,失败会继续执行
require_once ,只包含一次,失败就退出
include 'world.inc.php';
exit;
require 'world.inc.php';
echo '<h3>继续</h3>';
测试发现 require
也可以用在if中