目录
一、流程控制
三种流程控制:顺序结构、分支结构、循环结构;
二、分支结构
1、if的分支
①、单分支:
$sex = '女';
if($sex == '男'){
echo "man";
}
if($sex == '女'){
echo "women";
}
②、双分支
$sex = '女';
if($sex == '男'){
echo "man";
}else if($sex == '女'){
echo "women";
}
③、多分支
$sex = '女';
if($sex == '男'){
echo "man";
}else if($sex == '女'){
echo "women";
}else{
echo "数据不合法";//缺省语句
}
2、switch结构
当判断条件比较多时,php提供了一个switch分支结构
语法:
switch(变量){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
defaylt:
缺省语句体;
}
每个语句后加break,当符合条件运行完当前语句体后跳出switch。
若省略break,则当符合条件是运行当前及剩余的所有语句。
$day = '';
switch ($day){
case 1:
echo "星期一";
break;
case 2:
echo "星期二";
break;
case 3:
echo "星期三";
break;
case 4:
echo "星期四";
break;
case 5:
echo "星期五";
break;
case 6:
echo "星期六";
break;
case 7:
echo "星期日";
break;
default:
echo "数据不合法";
}
if和switch的区别
if结构的条件可以表示一个范围。
switch结构主要用于表示一个具体的值。
三、循环结构
break 跳出循环
continue 跳过当前循环体剩余部分进入下一个循环
1、for循环
语法:
for(循环控制变量初始化;表达式;循环控制变量的更改){
//循环体
}
for($i=1;$i<=100;$i++){
echo $i,"<br/>";
}
循环嵌套 (解决具有行列性质的问题)
//输出10行10列的表格
$tab = "<table border='1' rules='all' width='100' height='100'";
for($j=1;$j<=10;$j++){
$tab.="<tr>";
for($i=1;$i<=10;$i++){
$tab.="<td></td>";
}
$tab.="</tr>";
}
$tab.="</table>";
echo $tab;
2、while循环
语法:
while(表达式){
//循环体
}
$i=1;//循环控制变量初始化
while($i<=100){//表达式
echo $i,"<br/>";//循环体
$i++;//循环控制变量的更改
}
for与while的区别:
对于for循环结构,主要用于循环次数已知或根据某一条件可以确定
while主要用于循环次数未知的循环
3、do...while循环
语法:
do{
//循环体
}while(表达式)
说明:
首先执行循环体
循环体结束后,再判断表达式是否成立,不成立则直接结束循环结构,成立则再执行循环体。
$i=1;//循环控制变量初始化
do{
echo $i;
$i++;//循环控制变量的更改
}while($i<=100);//表达式
4、循环的结束与退出
①、continue
语法:continune 【n】
说明:n的取值是一个整数,默认为1;
n主要用于多层循环嵌套的情况;
结束当前循环结构的本次循环,继续上n层循环结构的下一次循环。
可运行下面代码自行理解。
for($j=1;$j<3;$j++) {//a循环
for ($i = 1; $i < 10; $i++) {//b循环
if ($i % 3 == 0) {
continue 1;//当前循环体后的语句不执行进入b循环的下一次循环
}
echo $i, "<br/>";
}
}
echo "<br/>";
for($j=1;$j<3;$j++) {//a循环
for ($i = 1; $i < 10; $i++) {//b循环
if ($i % 3 == 0) {
continue 2;//当前循环体后的语句不执行进入a循环的下一次循环
}
echo $i, "<br/>";
}
}
②、break
语法:break【n】
说明:n的取值是一个整数,默认为1;
n主要用于多层循环嵌套的情况;
直接结束上n层循环结构
可运行下面代码自行理解。
for($j=1;$j<3;$j++) {//a循环
for ($i = 1; $i < 10; $i++) {//b循环
if ($i % 3 == 0) {
break 1;//直接结束b循环
}
echo $i, "<br/>";
}
}
echo "<br/>";
for($j=1;$j<3;$j++) {//a循环
for ($i = 1; $i < 10; $i++) {//b循环
if ($i % 3 == 0) {
break 2;//直接结束a循环
}
echo $i, "<br/>";
}
}
四、流程控制语句的标签语法
用纯php生成html
<?php
/**
* Created by PhpStorm.
* User: lgz
* Date: 2019/3/18
* Time: 8:30
*/
$data=[
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000]
];
$tab ="<table border='1' rules='all'>";
$tab.="<tr><th>id</th><th>品牌</th><th>商品名</th><th>价格</th></tr>";
for($i=0;$i<4;$i++){
$tab.="<tr>";
$tab.="<td>".$data[$i][0]."</td>";
$tab.="<td>".$data[$i][1]."</td>";
$tab.="<td>".$data[$i][2]."</td>";
$tab.="<td>".$data[$i][3]."</td>";
$tab.="</tr>";
}
$tab.="</table>";
echo $tab;
php在将php代码嵌入到html文档时,又提供了一种标签语法。
<?php
//模拟从数据库读取的数据
$data=[
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000]
];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" rules="all">
<thead>
<tr>
<td>id</td>
<td>品牌</td>
<td>商品名</td>
<td>价格</td>
</tr>
</thead>
<tbody>
<?php for($i=0;$i<4;$i++){ //标签语法?>
<tr>
<td><?php echo $data[$i][0] ?></td>
<td><?php echo $data[$i][1] ?></td>
<td><?php echo $data[$i][2] ?></td>
<td><?php echo $data[$i][3] ?></td>
</tr>
<?php } ?>
</tbody>
</table>
</body>
</html>
①、if标签语法
标准格式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php if(1>2):?>
<p>true</p>
<?php elseif(3>4):?>
<p>3>4</p>
<?php else:?>
<p>3<4</p>
<?php endif;?>
</body>
</html>
简化格式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php if(1>2){ ?>
<p>true</p>
<?php }else if(3>4){?>
<p>3>4</p>
<?php }else{ ?>
<p>3<4</p>
<?php } ?>
</body>
</html>
②、for标签语法
标准格式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php for($i=1;$i<4;$i++): ?>
<p>hello</p>
<?php endfor ?>
<br/>
</body>
</html>
简化格式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php for($i=1;$i<4;$i++){ ?>
<p>hello</p>
<?php } ?>
</body>
</html>
③、whle标签语法
标准格式:
<?php
//模拟从数据库读取的数据
$i=0;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php while($i<4): ?>
<p>hello</p>
<?php $i++; endwhile ?>
</body>
</html>
简化格式:
<?php
//模拟从数据库读取的数据
$i=0;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<?php while($i<4){ ?>
<p>hello</p>
<?php $i++; }?>
</body>
</html>
五、文件载入
1、介绍
在实际开发中,经常会在一个php文件中引入其他的文件
被引入的文件可以是html文件也可以是php文件
2、语法
①、require
require(文件名)
require_once(文件名)
示例:
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" rules="all">
<thead>
<tr>
<td>id</td>
<td>品牌</td>
<td>商品名</td>
<td>价格</td>
</tr>
</thead>
<tbody>
<?php for($i=0;$i<4;$i++){ //标签语法?>
<tr>
<td><?php echo $data[$i][0] ?></td>
<td><?php echo $data[$i][1] ?></td>
<td><?php echo $data[$i][2] ?></td>
<td><?php echo $data[$i][3] ?></td>
</tr>
<?php } ?>
</tbody>
</table>
</body>
</html>
test1.php
<?php
//模拟从数据库读取的数据
$data=[
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000],
[10,'huanwei','mate 10',3000]
];
require "test.html";
?>
②、include
include(文件名)
include_once(文件名)
目的:
当前文件(php)有数据,想在被引用的文件中显示
在当前文件(php)中想使用另一个文件(php)中的功能性代码
3、引入路径问题
在实际项目中,对于html文件,不允许用户直接请求,而是指向一个php文件,让php文件引用这个html文件
当一个php文件引入一个html文档时,html文件本身也会引入一些其他的文件(img、css、js等等)。这时会发生路径更
改的问题。路径以当前php文件所在的路径为起点。
用./返回上层目录(.返回上一级,..返回上两级,自行试验)
通过域名再次访问图片
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
<img src="D:/wamp64/www/lgz/public/123.jpg" />
在HTML中通过绝对路径是访问不了的,因为HTML最终用户浏览器上运行,而非你的本地运行
-->
<img src="./public/123.jpg" />
<img src="http://localhost/lgz/public/123.jpg" />
</body>
</html>
test1.php
<?php
include "public/test.html";
4、include与require区别
include在引入文件时,如果被引入的文件不存在则会报错,但程序还会继续向下执行
require在引入文件时,如果被引入的文件不存在,则会中断程序的执行
require一般用于引入php文件,因为php里面一般书写的是功能性代码。
include一般用于引入html文档。
include、require与include_once、require_once的区别
include_once、require_once每次在引入文件时,会检查所要引入的文件之前有没有被引入过,如果有则不在引入。
(如果在引入php中的函数时,多次引入则会因重复定义函数而报错)
5、__DIR__\__FILE__
__FILE__ 用于获取文件所在的完整文件名
__DIR__ 用于获取文件所在的路径
__FILE__与__DIR__并不会被引入后所更改。
六、错误处理
1、错误的分类
①、编译错误
在编译过程中发生的错误,大多是由于程序员书写错误导致的
②、执行错误
在编译通过后,在执行阶段发生的错误,错误一旦发生,会根据错误的等级来决定是否中断程序的执行
③、逻辑错误
由于程序员的逻辑不严谨,而产生的错误
2、错误代码
①、系统错误
E_ERROR 致命错误,一旦发生中断程序执行
E_WEEING 警告错误,不中断程序执行
E_NOTICE 提示错误,不中断执行
E_PARSE 编译错误,中断执行
示例:自行通过调整语句顺序,看是否发生中断程序
<?php
//模拟从数据库读取的数据
echo "<h3>系统错误</h3>";
//gettype(); 是一个函数,用于获取变量的数据类型
gettype($v);//传递的变量未定义
gettype();//未传递一个变量
myfunction();//自己随便写的方法,未定义
②、自定义错误
E_USER_ERROR 用户级(用户自定义)的致命错误,中断程序
E_USER_WRRING 用户级(用户自定义)的警告错误,不中断程序
E_USER_NOTICE 用户级(用户自定义)的提示错误,不中断程序
3、错误的触发
①、系统错误的触发
程序员无法干涉系统错误的触发,系统错误由php自己检测并触发的
②、自定义的错误
trigger_error()
语法:
trigger_error(msg,type);
说明:
msg 错误描述信息
type 自定义错误代码(E_USER_ERROE、E_USER_WRRING、E_USER_NOTICE);
不使用错误处理机制仅提示:
<?php
function m_list($arr){
if(!is_array($arr)){
echo '参数的类型不正确';
}
for($i=0;$i<count($arr);$i++){
echo $arr[$i],'<br/>';
}
}
$arr = [10,20,30,40];
$a = 1;
m_list($a);
使用错误处理机制:
<?php
function m_list($arr){
if(!is_array($arr)){
trigger_error('参数的类型不正确',E_USER_ERROR);
}
for($i=0;$i<count($arr);$i++){
echo $arr[$i],'<br/>';
}
}
$arr = [10,20,30,40];
$a = 1;
m_list($a);
提示:
使用错误处理机制的好处是,可以将错误记录。默认会被记录到apache/logs/error.log。由于我在php.ini中设置了错误日志的记录位置,所以我的日志路径为D:\wamp64\logs\php_error.log
4、错误的控制设置
php错误控制可以在php.ini中进行,我们可以控制错误是否显示,还可以控制显示哪一类的错误
①、控制是否显示错误
display_errors = on 显示错误
display_errors = off 关闭错误的显示
②、控制是否显示错误
error_reporting =
<?php
//模拟从数据库读取的数据
ini_set('error_reporting',E_NOTICE | E_WARNING);
//显示E_NOTICE和E_WARNING的错误信息
//要显示全部 则value取E_ALL
//E_ALL & ~E_NOTICE 显示除了E_NOTICE的其他错误信息
echo "<h3>系统错误</h3>";
//gettype(); 是一个函数,用于获取变量的数据类型
gettype($v);//传递的变量未定义
gettype();//未传递一个变量
myfunction();//自己随便写的方法,未定义
5、错误的日志文件的设置
我们可以控制是否记录错误,以及错误日志的记录位置
①、是否记录错误
log_errors=on 记录错误
log_errors=off 不记录错误
②、错误记录的位置
如果没有设置error_log默认是记录到apache的错误日志中\logs\error.log(不推荐)
error_log=syslog 会记录到操作系统的日志中(不推荐)
error_log=文件名 记录到自定义的位置