流程控制
概念
- 顺序结构:代码按顺序执行
- 分支结构:写好代码,按条件执行
- 循环结构:写好代码,按条件循环执行
一. 顺序结构
概念
- 执行第一行
- 执行第二行
- 执行完成,销毁资源
二. 分支结构
概念
- if分支:互斥分支,根据条件执行下面的代码
- switch分支:粒子分支,根据条件颗粒强度,选择一块或多块执行
三. if分支
if分支结构:
- 简单if分支:只有一个代码块
- if(条件表达式)(满足条件后执行的代码块)
- 标准if分支:条件满足执行一个,不满足执行另一个
- if(条件表达式)(满足条件后执行的代码块)else(不满足执行的代码块)
- 复杂if分支:多个条件,条件递进
- if(条件1)(满足执行)ifelse(条件2)(不满足条件1满足条件2执行)…
- if分支只执行一个代码块
- if分支可以嵌入多个if分支
- 嵌套结构可以理解为复杂if分支的变种
用户提交表单
<!--2d.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>dya2</title>
</head>
<body>
<!--<form action="2d.php">-->
<!-- 内容:-->
<!-- <input type="test" name="name"/>-->
<!-- <input type="submit"/>-->
<!--</form>-->
<form action="2d.php" method="post">
内容:
<input type="test" name="test"/>
<input type="submit" value="POST"/>
</form>
<form action="2d.php" method="get">
内容:
<input type="test" name="test"/>
<input type="submit" value="GET"/>
</form>
<form action="2d.php"method="get">
内容1:<input type="test" name="test"/>
内容2:<input type="test" name="test2"/>
<input type="submit" value="GET提交"/>
</form>
<form action="2d.php"method="post">
内容1:<input type="test" name="test"/>
内容2:<input type="test" name="test2"/>
<input type="submit" value="POST提交"/>
</form>
</body>
</html>
3.1 简单if结构
#简单if结构
@ $pack = $_REQUEST['test'];
$weather = $pack;
if($weather == 'good'){
echo '出去走走';
}
3.2 标准if结构
#标准if结构
@$pack = $_REQUEST['test'];
$weather = $pack;
if($weather == 'good'){
echo '出去走走';
}else if($weather !='good'){
echo '在家睡觉';
}
3.3 复杂if结构
#复杂if结构
@$pack = $_REQUEST['test'];
$weather = $pack;
if($weather == '出太阳'){
echo '出去走走';
}elseif($weather == '刮风'){
echo '看电影';
}else if ($weather == '阴天'){
echo '看书';
}else{
echo '睡觉';
}
3.4 嵌套结构
#嵌套结构
@$pack = $_REQUEST['test'];
@$pack_value = $_REQUEST['test2'];
$weather = $pack;
$weather_s = $pack_value;
if($weather == '天气好'){
if ($weather_s == '出太阳'){
echo '出去走走';
}else{
echo '输入的啥玩意';
}
}else {
if ($weather == '天气不好') {
if ($weather_s == '阴天') {
echo '这天气碎觉不香?';
}else{
echo '你还是在家躺着吧';
}
}
}
四. switch分支
基本跟 C 一样
switch分支:一种接收颗粒条件的分支结构
- switch分支:条件是具体值,而不是范围条件
- switch代码块是写在一起的,使用 case 分开,而不是{}
- switch代码块允许执行多个(如果有必要的话)
条件:
- 条件必须是颗粒度的,通常是一个变量(没有比较符)
- 确定可能出现的结果:一个条件一个 case 指令
- 确定每个 case 指令下要执行的代码
- 确定每个 case 指令是否需要结束
- 使用break结束
- 如果不结束,代码会以此执行下一个 case 里的代码块
- 确定是否需要不满足条件代码块:default
- 没有:结束
- 有:确定 default 里的代码块
switch(条件变量){
case 值:
满足条件1要执行的代码块
代码执行控制:break
...
default:
不满足所有条件执行的代码块
代码执行控制:break
switch ($weather){
case '大太阳':
echo "没毛病出去走走";
break;
case '阴天':
echo '看电影';
break;
case '不知道': #没有break会接着下一个 case 执行
case '雨天';
echo '碎叫';
break;
default:
echo '你输入的什么玩意';
break;
}
内在逻辑
直接匹配你输入的然后执行,没有匹配就执行 default ,没有default 就退出
switch 使用 固定分支结构 内部 == 比较
没有 break 多个 case 共享一个代码块
switch 能做的分支,if都能做,但是if能做的switch不一定能做
五. 循环结构
循环结构:通过条件限定,某个代码块进行可控循环。
- 循环条件:判断是否继续循环
- 循环条件的变化:让循环条件改变
- 循环体:循环所执行的代码块
- 循环控制:对循环的控制
PHP 中的几种循环结构:
- while 循环:不确定循环多少次
- for 循环:指定循环次数
- foreach 循环:数组专用循环
- do-while 循环:跟 while 差不多
5.1 while循环
while循环:指定边界条件,持续执行代码
- while需要内部控制循环变量
- 基本上都用于不太明确次数的循环
while(条件表达式){
循环体;
循环条件变更;
}
一般会定义一个循环比哪里初始值和一个边界条件
while 是利用外部循环条件实现循环的
#whlie 循环
// $i = 0;
$i = $pack;
while ($i<=10){
echo $i; #12345678910
$i++;
}
5.2 for 循环
for 循环:将循环初始条件,循环边界条件,循环变更放在一起,一个结构里的循环方式。
- for 需要初始化条件,在结构里或外面都可以
- for 需要循环边界
- for 需要条件变更
- for 一般用于固定起始值,具有规律的循环
for(初始化表达式,边界判断表达式,条件变更表达式{
循环体;
}
#for 循环
echo "<br/>";
$i = $pack;
for (;$i< 100;$i++){
if($i%2 == 1){
echo "<br/>".$i.'是奇数';
}else{
echo "<br/>".$i.'不是奇数';
}
}
for 循环是线性输出的,一个循环就是一个线,两个循环就是一个面,三个循环就是立体
输出 乘法口诀表
#for 循环嵌套
echo "<br/>";
for ($i=1;$i<=9;$i++){
for ($j=1;$j<=9;$j++){
if ($j<=$i){
echo "$j x $i=". $j * $i."|";
}
}
echo "<br/>";
}
输出 1 - 100 的奇数流程图
for 循环流程
- 表达式1:用于初始化
- 多个条件可以用,逗号分割初始化
- 表达式2:用于验证条件
- 循环体:执行循环操作
- 表达式3:变更循环条件
5.2 foreach 循环
foreach 循环:php专门进行数组遍历的循环
- foreach:循环可以解析数组的下标和值
- foreach:语法
foreach(数组变量 as [下标变量 =>] 值变量){
通过下标变量读取数组中每个元素的下标(可以没有)
通过值变量读取数组中每个元素的值
}
步骤:
- 需要确定遍历的数组的下标
- 确定是否要用到下标
- 确定下标变量的值和变量
- 确定循环体
#foreach 循环
echo "<br/>";
$info = array(
'name'=>'杨重煌',
'age'=>'19',
'sex'=>'男');
foreach ($info as $key => $value){
echo $key.':'.$value."<br/>";
} # name:杨重煌age:19sex:男
数组里的元素都是通过元素指针访问的,默认指向第一个元素
5.3 do-while 循环
do-while循环 是先执行循环体 (do)然后在执行条件判断
- do-while 循环需要条件边界
- do-while 循环在内部变更循环条件
- do-while 用来处理不明确条件的循环
- do-while 语法
do{
循环体
循环变更条件
}while(循环条件判断);
步骤:
- 通常会定义一个循环初始值
- 确认循环体
- 如何变更循环条件
- 条件边界的判断
#do-while 循环
$i = 0;
do{
echo $i;
$i++;
}while($i<=10);
基本不使用 do-while
六. 循环控制
循环控制:
- 循环体内控制代码的执行方向
- 循环控制是为了增加程序的健壮性
- 根据需求(条件)控制
- 终止单次循环体:continue
- 终止循环:break
- 循环开始
- 循环体内是否需要判定条件
- 满足条件:选择控制
- 确定控制层级(嵌套)
- 条件不满足:不控制
# 循环控制 1-100非3的倍数的和
$s = 0;
for ($i=1;$i<=100;$i++){
if($i%3==0){
continue;
}$s +=$i;
}echo $s; #3367
# 求1-100和 要求内部控制
echo "<br/>";
$i = 0;
$s = 0;
while (true){
if ($i > 100) {
break;
}$s+=$i++;
}echo $s;
#循环控制版 乘法表
for ($i = 0;$i<=9;$i++){
for ($j = 0;$j<=9;$j++){
if ($j<=$i){
if ($j ==0 and $i==0 or $j ==0) {
continue;
}
echo "$j * $i =". $j * $i."|";
}else{
break;
}
}echo "<br/>";
}
#优化 乘法表
echo "<br/>";
for ($i = 0;$i<=9;$i++){
for ($j = 0;$j<=$i;$j++){
echo "$j * $i =". $j * $i." | ";
}echo "<br/>";
}
continue 流程控制
break 流程控制
七. HTML 标签语法
php是嵌入在html 中的
所以可能导致语法冲突 或者 可读性不高
如果在 html 中写php
if 分支
while循环
for 循环
foreach 循环
do-while 循环
等等都可以使用标签语法
标签语法通常不使用{} 使用:结尾 endfor 结束相应循环
标签语法是PHP 基本语法的替代方式
替代的{ 等于:(冒号)
替代的} 等于 end+标记内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<?php for ($i=1;$i<=9;$i++):?>
<tr>
<?php for ($j=1;$j<=$i;$j++):?>
<td>
<?php echo "$j * $i = ".$j* $i; ?>
</td>
<?php endfor; ?>
</tr>
<?php endfor; ?>
</table>
</body>
</html>
函数
- 函数概念
- 函数结构
- 函数规范
- 理解模块化编程 与 复用
函数有一个标识:函数名
函数的基本结构:
- 关键字:function
- 参数
- 函数体
- 返回值(return)
function 函数名(参数){
函数体(代码块)
return(返回值)
}
#模块化 乘法表
function mult(){
for ($i=1;$i<=9;$i++){
for ($j=1;$j<=$i;$j++){
echo "$j * $i =".$i * $j." ";
}echo "<br/>";
}
}
mult();
一. 函数内存分析 与 形参实参概念
- 函数的调用需要函数已经在内存中存在
- 函数不会自动运行
- 函数运算是在栈区开辟新的内存运行
- 函数运行完后会释放所占用内存
1.1 一个模块化代码基本步骤流程
1. 编译:将代码加载到内存区
- 读取代码
- 编译(确认没有语法错误)
- 加载到内存中
2. 执行
- 代码按条件 顺序,分支循环执行
- 函数的结构不会执行
3. 函数执行
- 寻找函数名(调用地点)
- 不存在(报错)
- 存在(继续)
在栈区开辟内存加载函数
- 处理参数
- 函数体执行
函数执行结束
- 栈区内存释放
- 回到函数调用地点
程序执行结束
- 释放所有内存
hello();
function hello(){
echo "hello PHP"." ".__FUNCTION__; #魔术常量 获取函数名
}
在php中,函数调用与函数没有先后顺序,但是建议把函数写在前面(先有,后用)
1.2 函数的参数
形参:
- 函数在运用时为了增加灵活性添加的占位符。
- 形参在定义时设置变量
- 形参可以在内部使用
- 形参跟函数外部的变量没有关系
- 形参根据需求而定,理论不限(不要太多)
新参的作用:
在函数内部做假设运算(允许外部调整运算数据)
$n =100;
function mult_n($n){
for ($i=1;$i<=$n;$i++){
for ($j=1;$j<=$i;$j++){
echo "$j * $i = ".$j * $i." ";
}echo "<br/>";
}
}
echo "<br/> 外部参数 n = ".$n."<br/>";
mult_n(3);
实参:
- 函数在调用时传递进去的实际参数
- 实参是调用函数时传递的数据
- 实参可以时数据,也可以时保存数据的表达式
- 通常有:
- 数据常量
- 变量
- 常量
- 运算表达式
- 实参的本质是将自己赋值给形参
- 实参需要对准形参(数量,顺序)及类型
- 名字可以完全相同,形参跟实参之间完全不影响
function my_sum($a,$b){
$c = $a + $b;
echo "$a + $b = $c";
}
$a =3;
define('实参b',123); #定义常量
my_sum(实参b,$a); #123 + 3 = 126
echo "<br/>";
my_sum(1-2,$c=1+42); #-1 + 43 = 42
形参默认值
- 默认值是指定义形参给一个大概率会出现的值
- 默认值在定义时赋值
- 默认值是在调用时才给形参赋值
- 有默认值后:
- 调用时不传递实参,系统自动给形参赋值默认值
- 调用时传递实参,系统会使用传递的,而不是默认的
让函数在没有调用时也能正常工作,增加灵活性
function default_p($s=9){
$c = 0;
if ($s == null){
echo "9*9 乘法表:<br/>";
for ($i=1;$i<=9;$i++){
for ($f=1;$f<=$i;$f++){
echo "$f * $i = ".$f*$i." ";
}
echo "<br/>";
}
}else{
echo "$s*$s 乘法表:<br/>";
for ($i=1;$i<=$s;$i++){
for ($f=1;$f<=$i;$f++){
echo "$f * $i = ".$f*$i." ";
}
echo "<br/>";
}
}
}
default_p();
default_p(5);
二. 参数传值方式
参数传值方式指在函数调用时,实参传递给形参的方式
- 传值方式有两种:
- 值传递:默认的,外部数据,如 function a($b);
- 引用传递:使用&符号,传递外部变量存储的内存地址,如 function a(&$b);
值传递不影响外部变量
引用传递会影响
#参数传值方式
function pbv($n){
#值传递
while ($n>=1){
echo $n--."<br/>";
}
}
$n1 = 4;
pbv($n1);
var_dump($n1); # 4
function pbv2(&$n2){
#引用传递
while ($n2>=1){
echo $n2--."<br/>";
}
}
$n2 = 10;
pbv2($n2);
var_dump($n2); # 0
三. 返回值
返回值:return
- 函数都有返回值 默认为 null
- 可以使用 return 返回任意类型
- return 会强制结束函数 所以 只会接收第一个return
- 需要一个接收 return 的变量
echo "<br/>";
function re(){
$a = __FUNCTION__;
}
$re = re();
var_dump($re);
function re2(){
$a =__FUNCTION__;
return $a;
}
$e = re2();
echo $e;
四. 函数规则
函数的命名规则,基本与C相同
- PHP函数不区分大小写
- PHP由字母,下划线,数字组成,不能与数字开头
- 函数命名尽量使用 下划线法与驼峰法
- 函数是解决小问题的,越小复用性越高
- 函数体内尽量不进行输出操作,函数只负责运算,不对结果负责(即结果 return 给外部处理)
转载:https://blog.csdn.net/qq_38626043/article/details/117231032