PHP
1.PHP简介
-
一种服务器端的 HTML脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。是一种广泛用于0pen Source(开放源代码〉的尤其适合Web 开发并可以嵌入HTM的多用途脚本语言。它的语法接近c,Java和 Per1,而且容易学习。该语言让web 开发人员快速的书写动态生成的网页
-
静态网站访问流程
-
动态网站访问流程
动态网站访问就比静态网站多了几个流程:服务器端解析、数据库
2.PHP基础
-
PHP代码标记
-
ASP标记:<% php代码 %>
-
短标记:<? php代码 ?>
以上两种基本弃用,如果要使用需要在配置文件中开启
-
脚本标记:>
-
标准标记(常用):<?php php代码 ?>
-
-
PHP注释
- 行注释:// 或者 #
- 块注释: /* 内容 */
-
PHP语句分割符
语句分隔符:在PHP中,代码是以行为单位,系统需要通过判断行的结束,该结束通常都是一个符号:分号“;”(英文状态下的分号)
特殊说明:
-
PHP中标记结束符 ?> 中自带语句结束符的效果,最后一行PHP代码可以没有语句结束符";"
-
PHP中其实很多代码的书写并不是嵌入到HTML中,而是单独存在,通常书写习惯中就不建议用标记结束符 ?> ,PHP会自动从开始到最后全部认为是PHP代码,从而解析.
3.变量
PHP是一种动态网站开发的脚本语言,动态语言特点是交互性,会有数据的传递,而PHP作为“中间人”,需要进行数据的传递,传递的前提就是PHP能自己存储数据(临时存储)
3.1 变量的基础认识
-
变量的基本概念
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的。
- 变量是用来存储数据的
- 变量是存在名字的
- 变量是通过名字来访问的:数据
- 变量是可以改变的:数据
-
变量的使用
PHP中的所有变量都必须使用 "$"符号
- 定义:在系统中增加对应的变量名字
- 赋值:可以将数据赋值给变量名(可以在定义的同时完成)
- 可以通过变量名访问存储的数据
- 可以将变量从内存中删除
<?php $var1; //定义变量 $var2=2; //定义同时赋值 echo $var2 //通过var2变量名字找到存储的内容2,然后输出 $var2=3; //修改变量 echo '<hr/>',$var2; // '<hr/>':水平分割线;'<br/>':换行 //删除变量:使用unset(变量名字) unset($var2); ?>
-
变量命名规则
- 在PHP中变量名字必须以 “$” 符号开始
- 名字有字母、数字和下划线构成,但是不用以数字开头
- 在PHP中本身还允许中文变量。比如:$中国=‘china’;
3.2 预定义变量
预定义变量:提前定义的变量,系统定义的变量,存储许多需要用到的数据(预定义变量都是数组)
-
$_GET:获取所有表单以GET方式提交的数据
-
$_POST:POST提交的数据会报存在此
-
$_REQUEST:GET和POST提叫的都会保存
-
$GLOBALS:php中所有的全局变量
-
$_SERVER:服务器信息
-
$_SESSION:session会话数据
-
$_COOKIE:cookie会话数据
-
$_ENV:环境信息
-
$_FILES:用户上传的文件信息
1.用法: $_FILES['对象']['name'] 客户端文件的原名称 $_FILES['对象']['type'] 客户端文件的MIME类型 。。。
3.3 可变变量
可变变量: 如果一个变量保存的值刚好是另一个变量的名字,那么可以直接通过访问一个变量得到另一个变量的值:在变量前面再多加一个$符号即可。
3.4 变量传值
变量传值:将一个变量赋值给另一个变量
变量传值的方式:值传递、引用传递
在内存中,通常有以下几个分区:
-
栈区:程序可以操作的内存部分(不存数据,运行程序代码),小但是速度快
-
代码段:存储程序的内存部分(不执行)
-
数据段:存储普通数据(分为全局区和静态区)
-
堆区:存储复杂数据,大但是效率低
-
**值传递:**将变量保存的值赋值一份,然后将新的值给另一个变量保存(两个变量没有关系)
-
**引用传递:**将变量保存的值所在的内存地址,传递给另一个变量:将两个变量指向同一块内存空间(两个变量是同一个值)
格式:KaTeX parse error: Expected 'EOF', got '&' at position 5: 新变量=&̲旧变量
3.5 静态变量
-
静态变量的定义:
静态变量:static,是在函数内部定义的变量。使用static关键字修饰,用来实现跨函数(跨函数:同一个函数多次调用)共享数据的变量:函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化。
-
静态变量的格式:
<?php function 函数名(){ static 变量名=值 //静态变量通常都赋值 }
-
静态变量的作用:
为了实现跨函数(跨函数:同一个函数多次调用)共享数据
-
静态变量的使用:
- 为了统计:当前函数被调用的次数
- 为了统筹函数多次调用得到的不同结果
4.常量
常量和变量一样,都是用来保存数据的。
-
常量的基本概念
常量:const/constant,是一种再程序运行当中,不可改变的量(数据)
常量一旦定义,通常数据不可改变(用户级别)
-
常量定义形式
在PHP中常量有两种定义方式(5.3之后才有两种)
- 使用定义常量的函数:define(‘常量名’,常量值);
- 5.3之后才有的:const 常量名=值;
常量的命令规则:
-
常量不需要使用 "$"符号,一旦使用系统就会认为是变量
-
常量的名字有字母、数组和下划线组成,但不能以数字开头
-
常量的名字通常是以大写字母为主(与变量加以区分)
-
常量命名的规则比变量要松散,可以使用一些特殊字符,但该方式只能使用define定义
define('-_-','smile'); const -_-=smlie //错误
注意细节:
-
Define 和 const 定义的常量是有区别:在于访问权限区别
-
定义常量默认情况下不区分大小写,但也可以区分,通过修改define的第三个参数
-
常量使用形式
-
常用的使用与变量一样,但是不可改变值(在定义的时候必须赋值)
-
特殊的使用:针对特殊的名字的常量,需要用到另一个访问常量的函数:constant(‘常量名’)
-
-
系统常量
系统常量:系统帮助用户定义的常量,用户可以直接使用
-
常用的系统常量
- PHP_VERSION:PHP版本号
- PHP_INT_SIZE:整形大小
- PHP_INT_MAX:整形能表示的最大值(PHP中整形是允许出现负数)
-
特殊的系统常量(又叫 系统魔术常量):双下划线开始+常量名+双下划线结束 这种常量称为:系统魔术常量,魔术常量的值通常会跟着环境变化而变化,但是用户改变不了
#字母可以为小写 1.__DIR__ :返回当前执行的脚本所在电脑的绝对路径 2.__FILE__ :返回当前执行的脚本所在电脑的绝对路径(会带出自己文件的名字) 3.__LINE__ :返回当前所属的行数 4.__NAMESPACE__ :返回当前所属的命名空间 5.__METHOD__ :返回当前所属的方法 6.__CLASS__ :返回当前所属的类 //格式:变量.__class__ 7.__base__:返回当前类所继承的'基类' //格式:变量.__class__.__base__;同时可以加上数组:变量.__class__.__base__[0]来获取第一个基类 8.__mro__:返回当前类和该类所继承的'基类' //格式:变量.__class__.__mro__;同样也能加上数组 9.__subclasses__():返回当前类的子类 //格式:变量.__class__.__base__[0].__subclasses__()[1];同时可以加上数组 10.__init__:初始化类,返回的类型是function,即得到函数名 //与__globals__结合使用 11.__globals__:获取function所处空间下可使用的module(模块)、方法以及所有变量 //格式:函数名.__globals__ 或者 __inin__.__globals__ 12.__import__:动态加载类和函数,也就是导入模块,经常用于导入os模块,__import__('os').popen('ls').read()] 13.__dic__:类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里 14.__str__():返回描写这个对象的字符串,可以理解成就是打印出来 15.__getattribute__():实例、类、函数都具有的__getattribute__魔术方法。事实上,在实例化的对象进行.操作的时候(形如:a.xxx/a.xxx()),都会自动去调用__getattribute__方法。因此我们同样可以直接通过这个方法来获取到实例、类、函数的属性 16.__getitem__():调用字典中的键值,其实就是调用这个魔术方法,比如a['b'],就是a.__getitem__('b') 17. __builtins__:内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身。即里面有很多常用的函数
-
5.数据类型
数据类型:data type,PHP是一种弱类型语言(与JavaScript一样):指的是存储的数据本身的类型,而不是变量的类型,变量本身没有数据类型。
#弱类型语言
1.自动转换,同时含有整数和浮点型、字符型时,系统都线转换成数值类型后,再运算
2. 布尔true为1,false为0
3. 字符串转数值有自己的规则
4. 以字母开头的字符串,永远为0
5. 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
5.1 PHP的八种数据类型:三大类八小类
- 简单(基本)数据类型:
- 整型:int/integer,系统分配4个字节存储,表示整数类型
- 浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
- 字符串型:string,系统根据实际长度分配,表示字符串
- 布尔类型:bool/boolean,表示布尔类型,只有两个值:true和false
- 复合数据类型:
- 对象类型:object,存放对象
- 数组类型:array,存储多个数据
- 特殊数据类型:
- 资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
- 空类型:NULL,只有一个值就是NULL(不能运算)
5.2 类型转换
-
自动转换:系统根据需求自己判断,自己转换(用的比较多,效率偏低)
-
强制(自动)转换:认为根据需要的目标类型转换
强制转换规则:在变量之前增加一个括号(),染指在里面写上对应类型:int/integer…其中NULL类型需要用到unset()。比如:(float) v a r , u n s e t ( N U L L ) var,unset(NULL) var,unset(NULL)a
在转换过程中,用的比较多的的就是转布尔类型(判断)和转数值类型(算法运算)
其他类型转数值的注意点:
- 布尔true为1,false为0
- 字符串转数值有自己的规则
- 以字母开头的字符串,永远为0
- 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
<?php
//创建数据
$a='abc1.1.1';
$b='1.1.1abc';
//自动转换,同时含有整数和浮点型、字符型时,系统都线转换成数值类型后,再运算
echo $a+$b; // 1.1
//强制转换
echo (float)$a,(float)$b // 0,1.1
5.3 类型判断
-
通过一组类型判断函数,来判断变量,最终返回这个变量所保存数据的数据类型:是一组以 is_开头 后面跟类型名字的函数:is_XXX(变量名)。
bool类型不用用echo来查看,可以使用 var_dump 结构查看:var_dump(变量1,变量2…)
1.is_XXX(变量名):是判断函数 2.var_dump(变量名):是查看函数,与echo类型,但权限更高 #注意两者结合的答案的格式!!!
<?php $a='abc1.1.1'; $b='1.1.1abc'; $f1=1.23; var_dump(is_int($a)); // bool(false) var_dump(is_int($a)); // bool(true) var_dump($f1); //float(1.23)
-
还有一组函数可以用来获取以及设定数据变量的类型:
-
Gettpye(变量名):获取类型,得到的是该类型对应的字符串
<?php $a='abc1.1.1'; $b='1.1.1abc'; echo gettype($a); // string
-
Settype(变量名,类型):设定数据类型,与强制转换不同。
- 强制转换:(类型)变量名,是对数据值复制的内容进行处理(不会处理,实际存储的内容),而Settype会直接改变数据本身。
<?php $a='abc1.1.1'; $b='1.1.1abc'; echo (float)$a; // 0 var_dump(is_int($a)); // bool(flase) var_dump(is_string($a)); // bool(true) 由此可见,强制转换不对$a的实际内容进行转换,$a还是字符串类型。 var_dump(settype($a,'int')); // bool(true) echo gettpye($a),$a; // integer,1 由此可见,settype将$a的实际内容进行了转换,$a由原先的字符串类型变成了整数型
-
6.整数、浮点类型
6.1 整数类型
整数类型:保存整数数值(范围限制),4个字节存储数据,最大就是32位共有42亿多个数。但是在PHP中默认是有符号类型(区分正负数),故只要21亿多正整数
在PHP中提供了四种整型的定义方式:十进制定义,二进制定义,八进制定义和十六进制定义:
$a=120 // 10进制
$a=0b110 // 2进制
$a=0120 // 8进制
$a=0x120 // 16进制
PHP中进制转换的函数:其他的可以在网上搜
- Decbin():十进制转二进制
- Decoct():十进制转八进制
- Dechex():十进制转十六进制
- Bindec():二进制转十进制
不难发现其中的规则:二、十、十六对应的分别是:bin、dec、hex。用它们再进行组合即可。
6.2 浮点类型
浮点型:小数类型 以及 超过整形所能存储范围的整数(不保证精度),精度范围大概在15给有效数字左右。
浮点型定义有两种方式:
$f=1.23;
$f=1.23e10; //科学计数法,其中e表示底数为10
7.运算符
7.1 赋值运算符
赋值运算:符号是“=”,表示将右边的结果(可以是变量、数据、常量和其他匀速出来的结果),保存到内存的某个位置,然后将位置的内存地址赋值给左侧的变量(常量)
7.2 算术运算符
与C语言一样!
7.3 比较运算符
7.4 逻辑运算符
7.5 连接运算符
连接运算:是PHP中将多个字符串拼接的一种符号
. :将两个字符串连接到一起
.= :复合运算,将左边的内容与右边的内容连接起来,然后重新赋值给左边变量
7.6 错误抑制符
在PHP中有一些错误可以提取预知,但是这些错误无法避免,但是又不希望报错给用户看,就可以使用错误抑制符处理。
@:在可能出错的表达式前面使用@符号即可
7.7 三目运算符
三目运算:有三个表达式参与的运算,三目运算中可以在包含三目运算,但得加上括号(),与C语言有点差别
语法格式:表达式1?表达式2:表达式3;
运算:如果表达式1成立,则执行表达式2,否则执行表达式3。
7.8 自操作运算符
自操作:自己操作自己的运算符
++:在原来的值上+1
–:在原来的值上-1
7.9 位运算符
位运算:取出计算机中最小的单位(位bit)进行运算
&:按位与,两个位都为1,结果位1,否则为0
|:按位或,两个有一个为1,结果为1
~:按位非,一个位如果为1则变为0,否则反之
^:按位异或,两个相同则位0,不同则为1
<<:按位左移,整个位向左移动一位,右边补0
》:按位右移,整个位向右移动一位,左边不符号相对应的内容(正数补0,负数补1)
注意:
- 系统进行任何位运算的时候,使用的都是补码
- 运算结束之后都必须转换成原码才是最终要显示的数据
8.流程控制
流程控制:代码执行的方向
8.1 控制分类
- 顺序结构:代码从上往下,顺序执行。(代码执行的最基本结构)
- 分支结构:给定一个条件,同时有多种可执行代码(块),然后会根据条件执行某一段代码
- 循环结构:在某个条件控制范围内,指定的代码(块)可以重复执行·
8.2 顺序结构
顺序结构:代码从上往下,顺序执行。(代码执行的最基本结构)
8.3 分支结构
-
If分支-----与C语言类似
- if
- if…else
- if…elseif…else
if分支,适用于所有的条件判断(分支结构)
-
Switch分支
Switch分支:有一组情形存在,通过一条件,通常有多个值,但是每个值都会对应不同的代码要执行
Switch判断方式:是是将条件放到分支结构内部判断
#Switch的基本语法: Switch(条件表达式){ //所有条件判断:逐个进行 case 值1: 要执行的代码段; break; case 值2: 要执行的代码段; 。。。 default: break; }
8.4 循环结构
循环结构:代码段在一定的控制下,可以多次执行
在PHP中循环结构有以下几种:
-
for循环:通过条件、起始和终止判断执行
#for循环基本语法 for(条件表达式1;条件表达式2;条件表达式3){ //条件表达式1:定义初始化条件,可以有多种赋值语句存在,适用逗号分隔即可 //条件表达式2:边界判定,限定循环执行的次数 //条件表达式3:用来执行条件变化(自操作) //循环体 }
-
while循环:通过判断条件终止
#while循环基本语法 条件初始; while(条件表达式){ //条件表达式就是判断边界条件 循环体; //循环条件的变化 }
-
do-while循环:跟while差不多
do-while:看着很像 while,while首先进行条件判定然后执行循环体,有可能出现第一次就条件不满足,那么就会直接失败(循环体一次都不执行)。Do-while 就是先干了再说(执行循环体),后判断条件。(至少会执行一次循环体)
#do-while基本语法: do{ //循环体 }while(条件表达式);
-
foreach循环:专门针对数组
8.5 流程控制替代语法
9.常用的系统函数
9.1 有关输出的函数
-
print():类似于echo 输出提供的内容,本质是一种结构《不是函我数),返回1,可以不需要使用括号
-
print_r():类似于var_dump,但是比var_dumpj简单,不会输出数据的类型,只会徐出值(数组打印使用比较多)
9.2 有关数字的函数
9.3 有关函数的函数
10.文件
10.1 文件包含的作用
无相关视频
10.2 文件包含的四种形式
无相关视频
10.3 文件加载原理
-
PHP代码的执行流程
- 读取代码文件(PHP程序)
- 编译:将PHP代码转换成字节码(生成opcode)
- zendengine来解析opcode,按照字节码去进行逻辑运算
- 转换成对应的HTML代码
-
文件加载原理
- 在文件加载(include或者require)的时候,系统会自动的将被包含文件中的代码相当于嵌入到当前文件中
- 加载位置:在哪加载,对应的文件中的代码嵌入的位置就是对应的include位置
- 在PHP中被包含的文件是单独进行编译的
PHP文件在编译的过程中如果出现了语法错误,那么会失败(不会执行);但是如果被包含文件有错误的时候,系统会在执行到包含include这条语句的时候才会报错
10.4 Include和require的区别
- include和include_once的区别:
- include:系统碰到一次就执行一次;如果对同一个文件进行多次加载,那么系统会执行多次;
- include_once:系统碰到多次,也只会执行一次
- require和include的区别:
- 本质都是包含文件,唯一的区别在于包含不到文件的时候,报错形式不一样
- include要求较低,包含出错代码还会继续执行,而require要求较高,文件包含出错就会停止执行
10.5 文件加载路径
文件在加载的时候需要指定文件路径才能保证PHP正确的找到对应的文件
-
文件的加载路径包含两大类:
-
绝对路径
从磁盘的根目录开始(本地绝对路径)
Windows:盘符C:/路径/PHP文件
Linux:/路径/PHP文件
从网站根目录开始(网络绝对路径)
/:相对于网站主机名字对应的路径
-
相对路径
从当前文件所在目录开始的路径
. 或者 ./ :表示当前文件夹
…/:表示上一级目录(当前文件夹的上一层文件夹)
-
-
绝对路径和相对路径的加载区别
- 绝对路径相对效率偏低,但是相对安全(路径不会出问题)
- 相对路径相对效率高些,但是容易出错(相对路径会发生改变
10.6 文件嵌套包含
-
文件嵌套包含:
一个文件包含另外一个文件,同时被包含的文件又包含了另外一个文件
-
嵌套包含的时候很容易出现相对路径出错的问题:
相对路径会因为文件的包含而改变(./ 和 …/):windows下面,每一个文件夹下都有 . 和 … 的文件夹
11.函数
11.1 函数的基本概念
函数:function,是一种语法结构(不会自动运行,必须通过调用才能执行),将实现某一个功能的代码块(多行代码)封装到一个结构中,从而实现代码的重复利用(复用)
11.2 函数定义语法
函数有几个对应的关键的:function关键字、函数名、参数(形参和实参)、函数体和返回值
#基本语法:
function 函数名(参数可有可无){
函数体
返回值:return结果;
}
#定义函数的目的:是为了实现代码的重复利用,一个功能一个函数(简单明了)
#函数的使用:通过访问 函数的名字+() ;如果函数在定义的过程中有参数,那么在调用的时候就必须传入对应的参数;
#注意:函数是一种结构,不会自动运行,必须通过调用才会执行
函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。
因此函数的调用的特点:只要系统在内存中能够找到对应的函数,就可以执行(函数的调用可以在函数定义之前)
//调用函数
display();
function display(){
echo 'hello world';
}
//调用函数
display();
#结果出现两个'hello world'
函数执行的内存分析:(函数的调用可以在函数定义之前的原因)
- 读取代码进入到代码段(编译:将代码编程字节码存储到内存)
- 根据代码逐行执行
- 编译和执行是分开的,先编译后执行
11.3 函数命名规范
命名规范:由字母、数字和下划线组成,但是不能以数字开头
函数作为一种常用的结构,一般遵循以下规则:函数通常名字代表着函数的功能,而有些功能会比较复杂,可能一个单词不足以表单,需要多个组合
- 驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写:showParentHead()
- 下划线法:单词之间通过下划线链接,并且所有单词都是小写:show_sefa_dead()
函数名字:在一个脚本周期中,不允许出现同名函数(通常在一个系统开发中都不会使用同名函数)
11.4 函数的参数
承数的参数分为两种:形参和实参
-
形参
形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数
-
实参
实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数
#形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算〈运算),那么需要在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部岁数据 <?php function add($a,$b){ //形参可以有多个,使用逗号分隔即可 echo $a+$b; } $a=10; add($a,20); //传入的实参可以是变量或者其他有值的表达式(变量、常量、运算符计算结果) ?> #函数执行的过程 1.系统调用add函数:去内存中寻找是否有add函数:有 2.系统会在栈区开辟内存空间运行函数add 3.系统会查看函数本身是否有形参:有,两个 4.系统会判断调用的时候是否有实参:有,两个 5.系统默认会将实参的值取出按照顺手赋值给形参 6.执行函数体 7.返回函数执行结果:30(返回值)
注意:
- 在PHP中允许实参多余形参(个数):函数内部不用而已;但是实参不能少于形参个数,否则会报错
- 在PHP中理论上形参个数没有限制〈实际开发不会太多)
-
默认值
默认值: default value,指的是形参的黑t认值,在函数定义的时候,就给形参进行一个初始赋值:如果实际调用传入的参数(实参)没有提供,那么形参就会使用定义时的值来进入函数内部参与运算
通常黑认值是用在一些,一定会有某个数据参与,但是可能通常是某个我们知道的值
注意事项:
- 默认值的定义是放在最后边的(可以多个),不能出现:左边形参有默认值,但是右边没有
- 函数外部定义的变量名学与函数定义的形参名字冲突(同名)是没有任何关系的;如果多个函数使用同样的形参名字也不冲突
11.5 函数的引用传递(引用传值)
实参在调用时会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如果是变量或者常量或者其他表达式)的结果(值〉取出来赋值给形参:形参与外部实际传入的参数本身没有任何关联关系:只是结果一样。
-
引用传值:
有的时候,希望在函数内部拿到的外部数据,能够在函数内部改变,那么就需要明确告知函数〈定义时),函数才会在调用的时候去主动获取外部躞数据的内存地址
#基本语法: function 函数名(形参1,&形参2){ //多了一个地址符 & 函数体 } #在调用的时候,必须给引用传值的参数位置传入实际参数,而且参数本身必须是变量。(变量才有指向的数据的内存地址)!!!
注意事项:
-
在调用的时候,必须给引用传值的参数位置传入实际参数,而且参数本身必须是变量。(变量才有指向的数据的内存地址)
-
在传入实参的时候,必须传入变量,若为其他的就会报错
-
11.6 函数体与返回值
-
**函数体:**函数内部的所有代码称为函数体
-
函数体:基本上所有代码都可以实现
- 定义变量
- 定义常量
- 使用流程控制
- 可以调用函数
-
-
**返回值:**return,指的是将函数体实现的结果,通过return关键字,返回给函数外部(函数调用处):在PHP中所有的函数都有返回值。如果没有明确return使用,那么系统会默认返回值为NULL。
- return在函数内部存在的价值:返回当前函威的结果(当前函数运行结束)
- return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置。(通常在系统配置文件中使用较多),在文件中也代表中终止文件后面的代码:return之后的内容不会执行。
11.7 可变函数
-
可变函数的定义:
可变函数:当前有一个变量所保存的值,刚好是一个函数的名字,那么就可以使用:变量名+() 来充当函数名使用
-
可变函数的格式:
$变量名='dis'; funtion dis(){ 函数体 } //使用可变函数调用函数 $变量名();
-
可变函数的用途
可变函数在系统使用的过程中还是比较多的,尤其是使用很多系统函数的时候:需要用户在外部定义一个自定义函数,但是是需要传入到系统函崴数内部使用
11.8 匿名函数
-
匿名函数的定义:
匿名函数:没有名字的函数
-
匿名函数的格式:
$变量名=funtion(){ 函数体 }; //这里需要 分号';' 结尾函数 //调用函数 $变量名(); //与可变函数的调用方式一样
变量保存匿名函数,本质得到的是一个对象(Closure)
-
闭包 (Closure)
闭包:closure,一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放〉和为自由变量提供绑定的计算环境(作用域)
12.错误处理
错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。
12.1 错误分类
-
语法错误(Parse error):
用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行
-
运行时错误(runtime error):
代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误
-
逻辑错误:
程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
12.2 错误代号
所有看到的错误代码在PHP中都被定义成了系统常量(可以直接使用)
-
系统错误:
- E_PARSE:编译错误,代码不会执行
- E_ERROR: fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)
- E_WARNING: warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果
- E_NOTICE: notice,通知错误,不会影响代码执行
-
用户错误:
- E_USER_ERROR
- E_USER_WARNING
- E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
-
其他:
- E_ALL:代表着所有从错误(通常在进行错误控制的时候使用比较多)
12.3 错误触发
-
程序运行时触发:
系统自动根据错误发生后,对比对应的错误信息,输出给用户:主要针对代码的语法错误和运行时错误
-
人为触发:
知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示
12.4 错误显示设置
错误显示设置:哪些错误该显示,以及该如何显示
在PHP中,其实有两种方式来设置当前脚本的错误处理
-
PHP的配置文件:全局配置: php.ini文件
- Display_errors:是否显示错误
- Error reporting:显示什么级别的错误
-
可以在运行的 PHP脚本中去设置:脚本运行时,在脚本中定义的配置项级别比配置文件高
-
Error. .reporting():设置对应的错误显示级别
lni_.set(‘配置文件中的配置项’,配置值)
-
12.5 错误日志设置
在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
- 不友好
- 不安全:错误会暴露网站很多信息(路径、文件名)
所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini set)设置对应 error log 配置项:
-
开启日志功能
-
指定路径
13.字符串
13.1 字符串定义语法
-
单引号字符串:使用单引号包裹
-
双引号字符串:使用双引号包裹
引号方式:比较适合定义那些比较短(不超过一行)或者没有结构要求的字符串;如果有结构要求或者内容超过一行,可以使用以下两种结构定义
-
nowdoc字符串:没有单引号的单引号字符串
$str=<<<‘边界符’
字符串内容 13.2中有边界符的规则
边界符;
-
heredoc字符串:没有双引号的双引号字符串
$str=<<<边界符
字符串内容
边界符;
13.3 字符串转义
-
字符串转义的含义:
转义的含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理:通常这种方式都是使用反斜杠+字母(单词)的特性:
- \r\n:回车换行
- \':在单引号字符串中显示单引号
- \":在双引号字符串中显示双引号
- \r:代表回车(理论上是回到当前行的首位置
- \n:代表新一行。
- \t:类似 tap键,输出4个空格
- \ : 在 P H P 中 使 用 :在PHP中使用 :在PHP中使用符号作为变量符号,因此需要特定识别
-
单引号和双引号的区别:
-
其中单引号字符串中只能识别 \‘,而双引号字符串中就除 \’ 之外,其他都能识别
-
双引号字符串中因为能够识别$符号,所以双引号中可以解析变量,而单引号不可以
-
-
双引号中变量识别的规则:
-
变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分
-
使用变量专业标识符(区分),给变量加上一组大括号 {}
-
-
结构化定义字符串变量的规则:
- 结构化定义字符串对应的边界符有条件:
- 上边界符后面不能跟任何内容(空格符也不行);
- 下边界符必须顶格:最左边
- 下边界同样后面只能跟分号,不能再跟任何内容(空格符也不行);
- 结构化定义字符串的内部(边界符之间)的所有内容都是字符串本身
- 结构化定义字符串对应的边界符有条件:
13.2 字符串长度
-
基本函数 strlen():
作用:得到字符串的长度(以字节为单位)
注意:在utf-8字符集中,中文占3个字节,但在url字符集中,中文占2个字节。
-
多字节字符串的长度问题:包含中文的长度
-
**多字节字符串扩展模块:**mbstring扩展(mb:Multi Bytes),需要在php.ini文件中开启即可。
13.4 字符串相关函数
- 转换函数:
- Implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
- Explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
- Str_split(字符串,字符串长度):按照指定长度拆分字符串得到数组
- 去除空格符函数:
- Trim(字符串[,指定字符]) []中的元素可有可无:去除两边的空格
- Ltrim():去除左边的
- Rtrim():去除右边的
- 截取函数:
- Substr(字符串,起始位置从0开始[,长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
- Strstr(字符串,匹配字符):从指定位置开始,截取到最后。(可以用来获取文件扩展名)
- 大小转换函数:
- Strtolower():全部小写
- Strtoupper():全部大写
- Ucfirst():首字母大写
- 查找函数:
- Strpos():判断字符在目标字符中首次出现的位置
- Strrpos():判断字符在目标字符中最后出现的位置
- 替换函数:
- Str_replace(匹配目标,替换的内容,字符串本身):将目标字符串中的部分字符串进行替换
- 格式化函数:
- printf(输出字符串有占位符,顺序占位内容…):格式化输出数据
- sprintf():与printf()一样的效果
- 其他:
- Str_repeat(目标,重复次数):重复某个字符串N次
- Str_shuffle():随机打乱字符串
14.数组
14.1 数组的概念
数组:array,数据的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据。
注意:PHP中的数组是很大的数据,所有存储位置是堆区,为当前数据分配一块连续的内存
14.2 数组定义语法
在PHP中系统提供多种定义数组的方式:
-
使用array关键字(最常用的):
$变量=array(元素1,元素2,…)
-
使用中括号来包裹数据:
$变量=[元素1,元素2…]
-
隐形定义数组:给变量增加一个中括号,系统自动变成数组
$变量[]=一个值; //中括号里面的内容称为下标,如果不提供下标,系统自动生成数字(从0开始)
$变量[下标]=值;
14.3 PHP数组特点
-
可以整数下标或者字符串下标
如果为正数,则称为:索引数组
如果为字符串,则称为:关联数组
如果混合使用,则称为:混合数组
-
数组元素的顺序以放入顺序为准,跟下标位置无关
-
特殊值下标的自动转换
true:1;false:0;NULL:“”
-
PHP中数组的元素没有类型和长度限制
14.4 多维数组
-
二维数组
二维数组的元素为一维数组
-
多维数组
在第二维的数组元素中可以继续是数组,在 PHP中没有维度限制(PHP本质并没有二维数组)
但是:不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率
-
异形数组(不规则数组)
异形数组:数组中的元素不规则,有普通基本变量也有数组。
在第二维的数组元素中可以继续是数组,在 PHP中没有维度限制(PHP本质并没有二维数组〉v
v
但是:不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率。v
·异形数组(不规则数组)
异形数组:数组中的元素不规则,有普通基本变量也有数组。v
在实际开发中,并不常用,尽量让数组元素规则化(便于进行访问)
14.5 数组遍历–三种方式
数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。
注意点:
1.例如:$arr=array(1,'name'=>'Tom',4,'age'=>12,6);
此时:第一个元素的下标为 0;
第二个元素的下标为:name;
第三个元素的下标为:1;
第四个元素的下标为:age;
第五个元素的下标为:2;
#注意下标的数字
-
遍历的格式
$arr=array(0=>array(‘name’=>‘Tom’),1=>(‘name’=>‘Jim’)); //二维数组
访问一维元素:$arr[一维下标]
$arr[0]; //结果:arry(‘name’=>‘Tom’);
访问二维元素:$arr[一维下标] [二维下标]
$arr[1] [‘name’]; //结果:Jim;
-
Foreach 遍历语法
基本语法:
foreach($数组变量 as [$下标=>] $值){ // 中括号里面的内容可有可无 //通过$下标访问元素的下标;通过$值访问元素值 }
-
foreach 遍历原理
foreach遍历原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针
#格式: foreach($arr as $k=>$v){ //循环体 } #步骤: 1.foreach会重置指针:让指针指向第一个元素 2.进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量$k中,将值取出放到对应的值变量$v中;此时指针会向下移动一位 3.等指针移动完后,进入循环体,开始执行代码 4.重复2和3,直到在2的时候遇到指针取不到内容为止,即此时指针指向最后一个元素的
-
for循环遍历数组
for循环:基于已知边界条件(起始和结束)然后有条件的变化,因此for循环遍历数组有对应条件:
- 获取数组长度:count(数组名) 函数用来得到元素的长度
- 要求数组元素的下标是规律的数字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XvJK0MTF-1669372511834)(D:\D盘 图片\Typora图片\QQ截图20220715150543.png)]
-
while 配合each()和list()函数遍历数组
-
each()函数:
each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针会自动下移,同时将拿到的元素的下标和值以一个四个元素的数组返回,如果each取不到结果(数组指针移动到最后),返回false
0下标–》取得元素的下标值
1下标–》取得元素的值
key下标–》取得元素的下标值
value下标–》取得元素的值
#格式:echo(数组名) $arr=array(1,'name'=>'Tom',3) print_r(echo($arr)); print_r(echo($arr)); #结果: Array ( [1]=>1 [value]=>1 [0]=>0 [key]=>0 ) Array //拿到之后将数组指针会自动下移,所以第二次的结果如下所示 ( [1]=>Tom [value]=>Tom [0]=>name [key]=>name ) Array ( [1]=>3 [value]=>3 [0]=>1 [key]=>1 )
-
list()函数:
List 函数使用: list是一种结构,不上一种函数(没有返回值),是list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中(批量为变量赋值:值来源于数组):list必须从索引数组中去获取数据,而且必须从o开始
-
14.6 数组排序函数
排序函数:对数组元素进行排序
- sort():顺序排序,即从低到高(下标重排)
- rsort():逆序排序
- asort():顺序排序(下标保留)
- arsort():逆序排序
- ksort():顺序排序(按照键名排,即下标)
- krsort():逆序排序
- shuffle():随机打乱数组元素(下标会重排)
14.7 数组指针函数
- reset():重置指针,将数组指针重置到首位,并且返回该值
- end():重置指针,将数组指针重置到最后一个元素,并且返回该值
- next():指针向后移一位,取得下一个元素值,即下移后指针所指向的值
- prev():指针向前移一位,取得上一个元素值
- current():获取当前指针所指向的元素值
- key():获取当前指针所指向的下标值
注意事项:
next()和prex()会移动指针,有可能导致指针移动到最前或者最后(离开数组),导致数组不能使用,通过 next()和prex()不能回到真确的指针位置。只能通过end()或者reset()进行指针重置
14.8 数组其他函数
- count():统计数组元素的数量
- array_push():从数组中加入一个元素(数组后面)
- array_pop():从数组中取出一个元素(数组后面)
- array_unshift():从数组中加入一个元素(数组前面)
- array_shift():从数组中取出一个元素(数组前面)
- array_reverse():数组元素反过来
- in_array():判断一个元素在数组中是否存在
- array_keys():获取一个数组的所有下标,并且返回一个索引数组
- array_values():获取一个数组的所有值,并且返回一个索引数组