第一章、PHP基础
PHP是一种适合Web开发的编程语言,运行于服务器端,可以在C/S架构中为客户端软件提供服务器接口,又可以在B/S上作为架构来搭建动态网站。(本篇文章以B/S架构为基础)
Apache为PHP提供工作环境
Apache
目录结构
默认监听端口号:80
默认站点目录:http://localhost
错误页面
状态码 | |
403 | Forbidden;拒绝访问 |
404 | Not Found;页面没有找到 |
500 | Internal Server Error;服务器内部错误 |
1xx 信息提示:这些状态代码表示临时的响应
2xx 成功:这类状态代码表明服务器成功地接受了客户端请求。
3xx 重定向:客户端浏览器必须采取更多操作来实现请求。例如:浏览器可能不得不请求服务器上其他不同的页面,或通过代理服务器重复该请求。
4xx - 客户端错误:发生错误,客户端出现问题。例如,客户端请求不存在的页面,客 户端未提供有效的身份验证信息。
5xx - 服务器错误:服务器由于遇到错误而不能完成该请求。
第二章、PHP基本语法
标记与注释
标记
标记类型 | 开始标记 | 结束标记 |
标准标记(最优) | < ? php | ? > |
短标记(需要将) | < ? | ? > |
注释
注释类型 | 格式 |
C++(常用) | / / |
C | / *……* / |
Shell | # |
输出语句
输出语句类型 | 含义 |
echo | 可包含多个,用“ ,”隔开 |
与echo用法相同,只能输出一个值 | |
print_r() | 内置函数,可以输出任意类型 |
var_dump() | 打印一个或多个类型的数据,还可以获取元素类型和个数 |
PHP标识符
- 只能由字母、数字、下划线组成,且不能包含空格
- 必须以字母、下划线开头
- 长度任意
- 用作变量名时,区分大小写
数据与运算
定义常量
常量定义方式 | 实例 |
define()函数 | define('常量名称','常量值',true/false:用于设置常量名是否对大小写敏感) |
const关键字 | cinst 常量名 = 常 量值 |
定义变量
PHP是弱语言,可以事先不申明就可以直接进行赋值使用
申明变量: $ 变量名
赋值方式 | 实例 |
传值赋值 | $ 变量名 = 值 |
引用赋值 | $ 变量名 = &(引用)$变量名 |
可变变量 | 套娃; $a = 'ni'; $ni = 'hao'; $hao = 'ma'; echo $a, ' ' ,$ $a ' ' ,$ $ $a; 返回:ni hao ma |
数据类型
- 布尔型 bool :true/false
- 整型 int
进制数 表示10 八进制 012 十进制 10 十六进制 0xa -
浮点型
-
字符串型
转义字符
字符 | 含义 |
\n | 换行 |
\r | 回车 |
\t | 水平指标符 |
\v | 垂直指标符 |
\e | Escape |
\f | 换页 |
\\ | 反斜线 |
\$ | 美元标记 |
\" | 双引号 |
数据类型转换
- 自动类型转换:PHP会自动进行数据类型转换
- 强制类型转换:在要转换的数据和变量前加上“(目标类型)”
运算符及优先级
- 算数运算符
- 字符串运算符 “ . ”:用于拼接两个字符串的运算符,拼接的类型都会自动转为字符串类型。
- 赋值运算符
- 比较运算符 "==="全等、"!=="不全等:不仅比较数值还要比较数据类型;"=="、"!="就只用比较值就行。
- 逻辑运算符 "&&"和"and"都是表示与,但"&&"优先级更高;"xor"表示异或。
- 递增递减运算符
- 位运算符
- 错误控制运算符 "@"放在要忽略的表达式错误前
流程控制语句
- 选择结构语句
- if单分支
if($score>=60){ echo '及格啦!';}
- if...else语句
if(score>=60){ echo '及格啦!';}else{ echo '挂科了。';}
- if...elseif...else语句(可以有很多个elseif,和switch有点类似)
- switch语句
switch (表达式){ case 值1:代码段1;break; case 值2:代码段2;break; defaul:代码段n;}
2.循环结构语句
- while语句
while(循环条件){ 循环体;}
- do...while 语句
do{ 循环体;}while(循环条件);
- for循环语句
for(定义变量;循环条件;变量自增或自减){ 代码段;}
3.跳转语句
- break语句
- continue语句
4.文件包含语句
include '文件路径';
第三章、函数
函数定义语法结构
访问函数外定义的变量,需要使用'global'关键字
function函数名([参数1,参数2,……]){ 函数体…… 要是想要函数的返回值,就需要使用return关键字}
参数设置
在函数中定义的变量在函数调用完了就会被释放
参数 | 示例 |
无参函数 | 函数体内需要有return |
按值传递 | function 函数名(参数1,参数2,……){};在引用的时候可以使用变量代替 |
引用传参 | 修改参数值function(&$ 变量名);用于全局变量 |
设置参数默认值 | 可以在定义函数时设置默认参数 |
指定参数类型 | PHP7.0版本后可以设置参数的数据类型(跟C语言格式差不多) |
嵌套调用
- 嵌套调用
在调用一个函数时,调用其他的函数,下面给个例子:
- 递归调用
一个函数在其函数体内调用自己
高级应用
- 静态变量
想要调用函数后,值能够保存就要使用静态变量:
- 可变函数
怎么说呢,这个函数,其实是一个规定,有点像可变变量($ 变量名)的用法你定义了一个函数,如果你想在某个变量里面使用的时候就在后面加一个"()"让它近似变成函数名的结构就行了。
这也说明一个问题,你可以用一个变量来代替函数名称。
- 回调函数
一般用于参数传递
call_user_func作为PHP的内置函数,可以接受用户自定义的回调函数作为参数
- 匿名函数
没有函数名称的函数,也称作闭包函数,一般用于临时定义的函数,用匿名函数就无需担心函数名称命名冲突的问题了。
PHP内置函数
- 字符串函数
- 一般括号"()"内第一个表示需要操作的字符串,第二个表示操作的起始位置,第三个表示操作的位数,若第三个被省略的话那就是一直操作到最后。
函数名称 | 功能描述 |
strlen() | 获取字符串长度 |
strpos() | 查找字符串首次出现的位置 |
strrpos() | 查找字符串最后一次出现的位置 |
str_replace() | 对字符串中的某些字符进行替换操作 |
substr() | 获取字符串中的子串 |
explode() | 使用一个字符串分割另一个字符串 |
implode() | 用指定的连接符将数组连接成一个字符串 |
trim() | 用指定字符串的首尾的空白字符 |
str_repeat() | 重复一个字符串 |
strcmp() | 用于判断两个字符串的大小 |
- 数学函数
函数名 | 功能描述 | 函数名 | 功能描述 |
abs() | 取绝对值 | min() | 取最小值 |
max() | 取最大值 | pi() | 取圆周率的值 |
ceil() | 向上取最接近的整数 | floor() | 向下取最接近的整数 |
fmod() | 取除法的浮点数余数 | pow() | 计算x的y次方 |
is_nan() | 判断是否为合法数值 | sqrt() | 取平方根 |
round() | 对浮点数进行四舍五入 | rand() | 随机生成整数 |
- 时间日期函数
函数名 | 功能描述 |
time() | 获取当前的UNIX时间戳 |
date() | 格式化一个本地时间/日期 |
mktime() | 获取指定日期的UNIX时间戳 |
shortime() | 将字符串转化成UNIX时间戳 |
microtime() | 获取当前的UNIX时间戳和微秒数 |
UNIX时间戳是表示格林威治时间1970年01月01日00时00分00秒到现在的总秒数
格式化时间戳
echo date('Y-m-d H-i-s');
第四章、数组
要是操作一批数据的话,你每一条信息都用一个变量来定义的话就很麻烦,而且这些数据一般都有一定的关联性,你把它们串在一起定义成一个数组不是很方便。那也就引出了这个章节要讲的内容。
在PHP中,数组是由一个或多个数组元素组成的,每个数组由键和值组成:"键"是元素的识别名称,"值"是元素内容;"键"和"值"存在一定对应关系称为"映射"。
数组构成:数组是由一个或多个数组元素组成的
数组元素:一每个数组元素由键(Key)和值(Value)构成
键:“键”为元素的识别名称,也被称为数组下标
值: “值”为元素的内容
映射: “键”和“值”之间存在一种对应关系,称之为映射
类型划分:根据键的数据类型,可以将数组划分为索引数组和关联数组
数组类型
- 索引数组
键为整数的数组,一般情况是从0开始,用来标记元素的位置,当然也可以自己定义;你要是不设置键的话基本上默认索引数组。
键 | 0 | 1 | 2 | 3 |
值 | 21 | 43 | 215 | 43 |
- 关联数组
键为字符串的数组,一般都是键和值有一定的逻辑关系;需要你自己定义键。
键 | 姓名 | 年龄 | 性别 | 电话 |
值 | 5t5 | 不详 | 男 | 怎么可能会告诉你 |
数组的基本使用
- 数组的定义
array()构建数组
//索引数组$fruit = array('apple','grape','pear');//省略了键名就是默认的0,1,2$sport = array(2=>'basketball',4=>'jogging');//自定义的键名2:篮球,4:慢跑//关联数组$ziliao = array('id'=>123,'name'=>'5t5','tel'=>'就不告诉你');//对应的键有对应的值
只要掌握这两个基本规则就可以把它们串起来使用。
- 数组的赋值
就直接赋值就行了,PHP没有那么讲究。
$arr[] = 123; //$arr[0]=123$arr[4] = 456;//$arr[4]=456$arr[] = '不想学啦';//$arr[5]='不想学啦' // []里面没有值的话就看上面要么从0开始,要么按顺序来$arr['name'] = '5t5';//$arr[name]='5t5'
- 短数组定义发
[ ]于array()的定义方式是相同的
$fruit = ['grape','pear'];$ziliao = ['name'=>'5t5','sex'=>'nan'];$num = [[2,3],[3,7]];//array(array(2,3),array(3,7));
- 数组的遍历
用foreach()语句来完成遍历
//方式一foreach (数组名称 as 键 => 值) { // 处理语句}//方式二foreach (数组名称 as 值) { // 处理语句}
$info = ['id'=>1,'name'=>'5t5','sex'=>'nan'];//第一种方法foreach($info as $k => $v);//一个键一个值的打印 echo &k.':'.$v.' ';//输出结果id:1 name:5t5 sex:nan//第二种方法foreach($info as $v)//只要值打印 echo $v.' '//输出的结果1 5t5 nan// . 这个是连接字符串的符号,应该还记得吧
- 数组的删除
用unset()函数来完成数组的删除
unset($info);
- 数组操作符
运算符 | 含义 | 示例 | 说明 |
+ | 联合 | $a + $b | $a和$b的联合,合并数组 |
== | 相等 | $a == $b | 如果$a和$b具有相同的键值对则为true |
=== | 全等 | $a === $b | 如果$a和$b具有相同的键值对并且顺序和类型都相同则为true |
!= | 不等 | $a != $b | 如果$a不等于$b则为true |
<> | 不等 | $a <> $b | 如果$a不等于$b则为true |
!== | 不全等 | $a !== $b | 如果$a不全等于$b则为true |
数组查找
- 顺序查找法
只需按照数组中元素的保存顺序,利用待查的值与数组中的元素从前往后一个一个的进行比较,直到找到目标值或查找失败。
- 二分查找法
每次将查找值与数组中间位置元素的值进行比较,相等返回;不等则排除掉数组中一半的元素,然后根据比较结果大或小,再与数组中剩余一半中间位置元素的值进行比较,以此类推,直到找到目标值或查找失败。
- 冒泡排序
实现原理:按照要求从小到大排序或从大到小排序,不断比较数组中相邻两个元素的值,较小或较大的元素前移。冒泡排序比较的轮数是数组长度减1,每轮比较的对数等于数组的长度减当前的轮数。
缺点:冒泡排序的效率很低,在实际中使用较少。
- 简单选择排序:
是一种非常直观的排序算法。
实现原理:从待排序的数组中选出最小或最大的一个元素与数组的第1个元素互换,接着再在剩余的数组元素中选择最小的一个与数组的第2个元素互换,依次类推,直到全部待排序的数组元素排序完成。
如按照从小到大的顺序完成简单选择排序,图中利用箭头标注的两个元素就是在此次循环中互换的元素。
- 快速排序
是对冒泡排序的一种优化。
实现原理:首先选择一个基准元素,通常选择待排序数组的第1个数组元素。通过一趟排序,将要排序的数组分成两个部分,其中一部分比基准元素小,另一部分比基准元素大,然后再利用同样的方法递归的排序划分出的两部分,直到将所有划分的数组排序完成。
- 插入排序
是冒泡排序的优化,是一种直观的简单排序算法。
实现原理:通过构建有序数组元素的存储,对未排序数组的元素,在已排序的数组中从最后一个元素向第一个元素遍历,找到相应位置并插入。其中,待排序数组的第1个元素会被看作是一个有序的数组,从第2个至最后一个元素会被看作是一个无序数组。
数组的常用函数
- 指针操作函数
用于指向数组中的某个元素,默认情况下,指向数组的第1个元素。通过移动或改变指针的位置,可以访问数组中的任意元素。
函数名称 | 功能描述 |
current() | 获取数组中当前指针指向的元素的值 |
key() | 获取数组中当前指针指向的元素的键 |
next() | 将数组中的内部指针向前移动一位 |
prev() | 将数组中的内部指针倒回一位 |
each() | 获取数组中当前的键值对并将数组指针向前移动一步 |
end() | 将数组的内部指针指向最后一个元素 |
reset() | 将数组的内部指针指向第一个元素 |
$arr = ['a', 'b', 'c', 'd'];echo key($arr) . ' - ' . current($arr); // 获取当前指针指向的键和值:0 - aecho next($arr); // 将当前指针向前移动一位:becho end($arr); // 将当前指针指向最后一个元素:decho prev($arr); // 将当前指针倒回一位:cecho reset($arr); // 将指针指向第1个元素:a
$sweets = ['Muffin', 'cookie', 'cake'];while (list($k, $v) = each($sweets)) { $curr = current($sweets); // 此时指针已经被each()移动到了下一位 // 输出结果:0 => Muffin-cookie 1 => cookie-cake 2 => cake- echo $k => $v-$curr ;}
- 数组元素操作函数
在操作数组过程中,经常会遇到在数组的前面或后面添加或删除元素的情况。
函数名称 | 功能描述 |
array_pop() | 将数组最后一个元素弹出(出栈) |
array_push() | 将一个或多个元素压入数组的末尾(入栈) |
array_unshift() | 在数组开头插入一个或多个元素 |
array_shift() | 将数组开头的元素移出数组 |
array_unique() | 移除数组中重复的值 |
array_slice() | 从数组中截取部分数组 |
array_splice() | 将数组中的一部分元素去掉并用其他值取代 |
$arr = ['puff', 'Tiramisu'];array_pop($arr); // 移出数组最后一个元素print_r($arr); // 输出结果:Array ( [0] => puff ) array_push($arr, 'cookie'); // 在数组末尾添加元素print_r($arr); // 输出结果:Array ( [0] => puff [1] => cookie ) array_unshift($arr, 22, 33);// 在数组开头插入多个元素print_r($arr); // 输出结果: Array ( [0] => 22 [1] => 33 [2] => puff [3] => cookie ) array_shift($arr); // 移出数组第一个元素print_r($arr); // 输出结果:Array ( [0] => 33 [1] => puff [2] => cookie )
- 数组排序函数
对于数组的排序,除了可使用前面小节讲解的排序算法实现外。PHP还提供了内置的数组排序函数,可以轻松对数组实现排序、逆向排序、按键名排序等操作。
函数名称 | 功能描述 |
sort() | 对数组排序(从低到高) |
rsort() | 对数组逆向排序(从高到低) |
asort() | 对数组进行排序并保持键值关系 |
ksort() | 对数组按照键名排序 |
arsort() | 对数组进行逆向排序并保持键值关系 |
krsort() | 对数组按照键名逆向排序 |
shuffle() | 将数组元素顺序打乱 |
array_multisort() | 对多个数组或多维数组进行排序 |
$weather = ['sun', 'rain', 'haze'];asort($weather);// 保持键值关系正序排序print_r($weather);// 输出结果:Array ( [2] => haze [1] => rain [0] => sun ) sort($weather);// 按正常类型正序排序print_r($weather);// 输出结果:Array ( [0] => haze [1] => rain [2] => sun ) rsort($weather);// 按正常类型倒序排序:print_r($weather);// 输出结果:Array ( [0] => sun [1] => rain [2] => haze )
- 索引函数
数组中元素的查找,除了前面讲解的查找算法外,PHP还为其提供了内置函数。
函数名称 | 功能描述 |
in_array() | 检查数组中是否存在某个值 |
array_search() | 在数组中搜索给定的值,如果成功则返回相应的键名 |
array_key_exists() | 检查给定的键名是否存在于数组中 |
$data = ['a' => 1, 'b' => 2, 'c' => 3];var_dump(in_array(2, $data)); // 输出结果:bool(true)var_dump(array_search(2, $data)); // 输出结果:string(1) "b" var_dump(array_key_exists(2, $data)); // 输出结果:bool(false)
数组在字符串和函数中的应用
- PHP提供的explode()函数用于根据指定字符对字符串进行分割
- explode()函数的返回值类型是数组类型:第1个参数表示分隔符、第2个参数表示要分割的字符串、第3个参数是可选的,表示返回的数组中最多包含的元素个数,当其为负数m时,表示返回除了最后的m个元素外的所有元素,当其为0时,则把它当做1处理。
// ① 字符串分割成数组var_dump(explode('n', 'banana'));// 输出结果:array(3) { [0]=> string(2) "ba" [1]=> string(1) "a" [2]=> string(1) "a" } // ② 分割时限制次数var_dump(explode('n', 'banana', 2));// 输出结果:array(2) { [0]=> string(2) "ba" [1]=> string(3) "ana" } // ③ 返回除了最后2个元素外的所有元素var_dump(explode('n', 'banana', -2));// 输出结果:array(1) { [0]=> string(2) "ba" }
- PHP提供的implode()函数用于利用指定字符将一维数组内的元素值连接成字符串
- implode()函数的返回值类型为字符串型:第1个参数表示连接字符串、第2个参数表示待转换的数组。其中,不论指定字符是否存在,只要第2个参数是空数组,结果都为空字符串。值得一提的是,由于历史原因,该函数的第1个参数可以省略。
// ① 利用指定字符连接一维数组元素的值echo implode('-', ['a', 'b', 'c']);// 输出结果:a-b-cecho implode(',', ['a' => 1, 'b' => 2]); // 输出结果:1,2// ② 省略指定字符echo implode(['a', 'b', 'c']);// 输出结果:abc// ③ 利用指定字符连接一个空数组var_dump(implode('it', []));// 输出结果:string(0) ""
- 将数组作为参数调用函数
在PHP中,call_user_func_array()函数可以实现回调函数的调用,并将一个数组作为回调函数的参数。回调函数执行后,其返回值将作为call_user_func_array()函数的返回值进行返回。
// 示例1,输出结果:10, 20function test($a, $b){echo "$a, $b";}echo call_user_func_array('test', [10, 20]); // 示例2,输出结果:int(1) int(2)call_user_func_array('var_dump', ['a' => 1, 'b' => 2]);
第五章、错误处理及调试
- 错误用于指出语法、环境或编程问题。根据错误出现在编程过程中的不同环节,大致可以分为以下4类。
语法错误 | 指编写的代码不符合PHP的编写规范 |
逻辑错误 | 最让人头疼,不但不会阻止PHP脚本的执行,也不会显示出错误信息 |
环境错误 | 是由于PHP开发环境配置的问题引起的代码报错 |
运行错误 | 一般不会阻止PHP脚本的执行,但会导致程序出现潜在的问题 |
- PHP中的每个错误都有一个错误级别与之关联,用于表示当前错误的等级。 例如Error、Warning、Notice等错误。 PHP采用常量的形式来表示错误级别,每个错误级别都是一个整型。
级别常量 | 值 | 描述 |
E_ERROR | 1 | 致命的运行时错误,这类错误不可恢复,会导致脚本停止运行 |
E_WARNING | 2 | 运行时警告,仅提示信息,但是脚本不会停止运行 |
E_PARSE | 4 | 编译时语法解析错误,说明代码存在语法错误,无法执行 |
E_NOTICE | 8 | 运行时通知,表示脚本遇到可能会表现为错误的情况 |
E_CORE_ERROR | 16 | 类似E_ERROR,是由PHP引擎核心产生的 |
E_CORE_WARNING | 32 | 类似E_WARNING,是由PHP引擎核心产生的 |
E_COMPILE_ERROR | 64 | 类似E_ERROR,是由Zend脚本引擎产生的 |
E_COMPILE_WARNING | 128 | 类似E_WARNING,是由Zend脚本引擎产生的 |
E_USER_ERROR | 256 | 类似E_ERROR,由用户在代码中使用trigger_error()产生的 |
E_USER_WARNING | 512 | 类似E_WARNING,由用户在代码中使用trigger_error()产生的 |
E_USER_NOTICE | 1024 | 类似E_NOTICE,由用户在代码中使用trigger_error()产生的 |
E_STRICT | 2048 | 严格语法检查,确保代码具有互用性和向前兼容性 |
E_DEPRECATED | 8192 | 运行时通知,对未来版本中可能无法正常工作的代码给出警告 |
E_ALL | 32767 | 表示所有的错误和警告信息(在PHP 5.4之前不包括E_STRICT) |
// ① 使用未定义的变量echo $var;// 提示信息“Notice: Undefined variable...”// ② 使用未定义的常量echo PI;// 提示信息“Notice: Use of undefined constant...”// ③ 访问不存在的数组元素$arr = array();echo $arr['age'];// 提示信息“Notice: Undefined index: age...”
- 手动触发错误
bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )//第1个参数是错误信息内容//第2个参数是错误类别,默认为E_UESR_NOTICE
第六章、PHP与Web页面交互
Web交互的流程
- web表单交互
当PHP收到来自浏览器提交的数据后,会自动保存到超全局变量中;超全局变量是PHP预定义好的变量,可以在PHP脚本的任何位置使用;常见的超全局数组变量有$_POST、$_GET等。
- 当表单的method属性提交方式为POST时,浏览器发送POST请求通过POST方式提交的数据会保存到$_POST中
- 当表单的method属性提交方式为GET时,浏览器发送GET请求通过GET方式提交的数据会保存到$_GET中
2.URL参数交互
当表单以GET方式提交时,会将用户填写的内容放在URL参数中进行提交。表单的method属性删除(或将其值改为get),然后提交表单,会得到如下URL。
http://localhost/login.php?username=test&password=123456
“? ”后面的内容为参数信息 参数是由参数名和参数值组成的,中间使用等号“= ”进行连接 多个参数之间使用“& ”分隔 username和 password 是参数名,对应表单中的 name 属性 test和 123456 是参数值,对应用户填写的内容 3.数组方式提交数据 复选框是一种支持提交多个值的表单控件,在编写表单时应将其name 属性设置为数组。 游泳 读书 跑步
4.HTML特殊字符处理
硬件 | 说明 |
nl2br() | 将字符串中的换行符前插入HTML换行标记 |
strip_tags() | 从字符串中去除HTML和PHP标记 |
htmlspecialchars() | 将字符串中的特殊字符转换为HTML实体字符 |
htmlspecialchars_decode() | 将字符串中的HTML实体字符转换回原来的字符 |
urlencode() | 编码URL字符串 |
urldecode() | 解码已编码的URL字符串 |
http_build_query() | 生成URL编码后的字符串 |
HTTP协议
HyperText Transfer Protocol的简称,超文本传输协议,专门用于定义浏览器与Web服务器之间数据交换的格式。
HTTP是一种基于“请求”和“响应”的协议当
客户端与服务器建立连接后,由客户端(浏览器)向服务器端发送一个请求,被称作HTTP请求
客户端与服务器建立连接后,服务器接收到请求后会做出响应,称为HTTP响应
- PHP处理过程
在浏览器与服务器的交互过程中,Web服务器通过HTTP协议与浏览器进行交互,PHP只用于处理动态请求。
- HTTP请求消息
来源地址:https://blog.csdn.net/m0_52677891/article/details/127990108