函数
函数的基本概念:
函数function,是一种语法结构,将实现某一个功能的代码块(多含代码)封装到一个结构中,从而实现代码的重复利用
函数的定义语法
函数有几个对应的关键点:function关键字、函数名、参数(形参和实参)、函数体和返回值
基本语法是:
function 函数名([参数]){
//函数体
//
}
定义函数的目的:是为了实现代码的重复利用,一个功能一个函数(简单明了)
函数的使用:通过访问函数的名字+() //调用函数在定义的过程中有参数,那么在调用的时候就必须传入对应的参数
函数是一种结构,不会自动运行
函数是在代码执行阶段碰到函数名字的时候才会调用,不是在编译阶段。
函数调用的特点,只要系统在内存中找到对应的函数,就可以执行函数,函数调用可以在定义之前
函数执行的内存分析:
- 读取代码进入到代码段(编译:将代码变成字节码存储到内存)
- 根据代码逐行执行
以上原因:编译执行(先编译后执行)
参数详解
函数参数分为两种:形参和实参
形参
形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数
实参
实参:具有实际意义的参数,函数调用时使用的参数
形参是实参的载体,实参调用的时候,需要传入到函数内部参与计算的,那么需要在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以实参形式传递给实参,从而使得函数内部可以用到外部数据
注意:在php当中允许实参多余形参(个数):函数内部不用而已
在php中理论上形参个数没有限制(实际开发中不会太多)
默认值
默认值;default value,指的是,在函数定义的时候,就给形参进行一个初始的赋值:如果实际调用传入的参数(实参)没有提供,那么形参就会使用定义时的值来进入函数内部参与运算
通常默认值是用在一些,一定会有某个数据参与,但是可能通常是某个我们知道的值。
引用传递
实参在调用时会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如过时变量或者常量或者其他表达式)的结果取出来赋值给形参:形参与外部世纪传入的参数本身没有任何关联关系:只是结果一样
有时候,希望在函数内部拿到的外部数据,能够在函数内部改变,那么就需要明确告知函数,函数才会在调用的时候去主动获取外部数据的内存地址。以上这种定义形式才是引用传递。
基本语法:
function 函数名(形参1,&形参2){
//函数体
}
在调用的时候,必须给引用传值的参数位置传入实际参数,而且参数本身必须是变量。(变量才有指向的数据)
引用传值注意事项:在传入实参的时候,必须传入变量
函数体
函数体:函数内部(大括号{}里面)的所有代码都称之为函数体
函数体:基本上所有的代码都可以实现
- 定义变量
- 定义常量
- 使用流程控制(分支、循环)
函数返回值
返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处):
在php中所有的函数都有返回值。(如果没有明确return使用,那么系统默认返回null)
返回值作用:将结果返回给调用处,返回值可以是任意数据类型。
return关键字:
- return在函数内部存在的价值:返回当前函数的结果(当前函数运行结束)
- return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当期文件的位置。(通常在系统配置文件使用较多)
作用域
作用域:变量(常量)能够被访问的区域
- 变量可以在普遍代码中定义
- 变量也可以在函数内部定义
在php中作用域严格来说分为两种:但是php中内部还定义一些严格意义之外的一种,所以总共算三种
- 全局变量:用户普通定义的变量
所属全局空间:在php中只允许在全局空间中使用:理论上函数内部不可方法
脚本周期:直到脚本结束(最后一行代码执行完)
- 局部变量:就是在函数内部定义的变量
所属当前函数空间:在php中只允许在当前函数自己内部使用
函数周期:函数执行结束(在函数栈区中开辟的独立空间中运行)
- 超全局变量:系统定义的变量(预定义变量:$_server、$_POST等)
所属超全局空间:没有访问限制(函数内外都可以使用)
超全局变量会将全局变量自动纳入到$GLOBALS没有作用域限制,所以能够帮助局部去访问全局变量
也可以使用引用传值
在php中,起始还有一种方式,能够实现全局访问局部,同时局部也可以访问全局:global关键字
global关键字:是一种在函数里面定义变量的一种方式
global变量名; //不能赋值
变量名 = 值; //修改
静态变量
静态变量:static,是在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据的变量:函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化。
基本语法:
function 函数名(){
//定义变量
$tatic $变量名=值 //通常会在定义的时候就直接赋值
}
静态变量的作用是为了跨函数共享数据(同一个函数被多次调用)
静态变量不会被清空,普通变量会被清空。
可变函数
当前有一个变量所保存的值,刚还是一个函数的名字,那么就可以使用变量+()来充当函数名来使用。
$变量=’display’;
function display();
//可变函数
$变量()
匿名函数
基本概念
匿名函数:没有名字的函数
基本语法:
变量名=function(){
函数体
};
变量保存匿名函数,本质得到的是一个对象(closure)
闭包
闭包:closure,一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由便利以及他们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)
简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的函数还在引用(函数的内部函数:匿名函数)
证明:函数的局部变量在函数使用完之后没有被释放?
- 使用内部匿名函数
- 匿名函数使用句变量:use
- 匿名函数被返回给外部使用
伪类型
伪类型:假类型,实际上在php中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看我们的操作手册,从而更好的学习。
伪类型,主要有两种:在三大类八小类之外:
minxed:混合的,可以是多种php中的数据类型
number:可以是任意数值类型(整形和浮点型)
函数命名规范
命名规范:由字母、数字下划线组成,但是不能以数字开头
函数作为一种常用的结构,一般遵循以下的规则:
函数一般名字代表着函数的功能,一个单词不足以表达的时候,需要多个单子组合。
- 驼峰法:除了左边第一个单词外,后面所有的单词首写字母都大写:showParentinfo()
- 下划线法:单词之间通过下划线链接,单词都是小写:show_parent_info()
函数名字:在一个脚本周期中,不允许出现同名函数(通常在一个系统开发中,不会使用同名函数)
常用系统函数
1 有关输出的函数
print(): 类似于echo输出提供的内容,本质是一种结构(不是函数),他是返回1,可以不需要使用括号
print_r() 类似于var_dump ,但是var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
2有关时间的函数
date():按照指定格式对应的时间戳 (从1940年格林时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前的时间戳
time()获取当前时间对应的时间戳
microtime() 获取微妙级别的时间
3有关数字的函数
max()指定参数中的最大值
min()比较两个数中的较小值
rand()随机数
mt_rand()与rand一样只是底层结构不一样,效率比rand高
round()四舍五入
cell():向上取整
floor():向下取整
pow():求指定数字的指定指数次结果:pow(2,8)=2^8==256
abs():绝对值
sqrt():求平方根
有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全)
func_get_arg():在自定义函数中获取指定数值对应的参数
func_get_args():在自定义函数中获取所有的参数(数组)
func_num_args():获取当前自定义函数的参数变量
错误处理
错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。
错误分类
- 语法错误:用户书写的代码不符合php的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行parse error。
- 运行时错误,代码编译通过,代码在执行时候,出现条件不满足导致的错误,runtime error
- 逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得到不想要的结果
错误代号
- 系统错误:E_ERROR,E_WARNING,E_NOTICT
- 用户错误:E_USER_ERROR,E_USER_WARING,E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
- 其他:E_ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开发过程中(开发环境使用)
所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作
错误触发
程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,输出给用户,主要针对代码的语法错误和运行时错误
人为触发:知道某些逻辑可能会出错,从而使用对应
可以通过第二个参数进行严格性控制
错误显示设置
错误显示设置:哪些错误该显示,以及该如何显示
在php中,其实有两种方式来设置当前脚本的错误处理
- php的配置文件:全局配置:php.ini文件
display__errors:是否显示错误
error——reporting:显示什么级别错误
字符串类型
字符串定义语法
单引号字符串:使用单引号包裹
双引号字符串;使用双引号包裹
引号定义:比较适合定义哪些比较短(不超过一行)或者没有结构要求的字符串
如果有结构要求,或者内容超过一行,可以使用以下两种结构定义
nowdoc字符串:没有单引号的字符串
$str=<<<边界符
字符串内容
边界符;
heredoc字符串:没有双引号的双引号字符串
herdoc和nowdoc比引号还是区别多一点
字符串转义
转义的含义:在计算机通用协议中,有一些特定的方式定义的字母,系统会特定处理:通常这种方式都是使用反斜杠+字母(单词)的特性:
\r\n:回车换行
PHP在识别转义字符的时候也是使用同样的模式:反斜杠+字母
在php中系统常用的转义符号:
\’ 在单引号字符串中显示单引号
\” 在双引号字符串中显示双引号
\r 代表回车(理论上是回到当前行的首位置)
\n 代表新一行
\t 类型tab建
\$ 在php中使用$符号作为变量符号,因此需要特定识别
其中单引号中能够识别\’,双引号当中不能识别
双引号中因为能够识别$符号,所以双引号中可以解析变量,而单引号不可以
双引号中变量识别的规则
- 变量本身系统能够与后面的内容区分:应该保证变量的独立性,不要让系统难以区分
- 使用变量专业标识符(区分),给变量加上一组大括号
字符串相关函数
- 转换函数:implode(),explode(),str_split()
implode(连接方式,数组):将数组中的元素安装某个规则链接成一个字符串
explode(分隔字符,目标字符串):将字符串按照某个格式进行分隔,变成数组
中国|北京|顺义 == array(‘中国’,‘北京’,‘顺义’)
str_split(字符串,字符长度):按照指定长度拆分字符串得到数组
- 截取函数:trim(),ltrim(),rtrim()
trim(字符串[指定字符串]):本身默认是用来去除两边的空格(中间不行),但是也是可以指定要去除的内容,是按照指定的内容循环去除两边的内容:直到碰到一个不是目标字符为止
ltrim():去除左边的
rtrim():去除右边的
- 截取函数:substr(),strstr()
substr(字符串,起始位置从0开始,[长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
strstr(字符串·,匹配字符):从指定位置开始截取到最末尾
- 大小转换函数:strtolower(),strtoupper(),ucfirst()
strtolower:全部小写
strtoupper:全部大写
ucfirst:首字母大写
- 查找函数:strpos(),strrpos()
- 替换函数:str_replace()
- 格式化函数:printf(),sprint()
- 其他:str_repeat,str_shuffle()
数组详解
数组的概念
数组:array,数组的组合,指将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器的所有数据。
数组定义语法
在php中系统提供了多种定义数组的方式:
- 使用array关键字:最常用的
$变量 =array(元素1,元素2,元素3..);
- 可以使用中括号包裹数据:
$变量=[元素1,元素2]
- 隐形定义数组:给变量增加一个中括号,系统会自动变成数组
$变量[]=值1;
$变量[下标]=值;//中括号里面的内容称之为下标key,该下标可以是字母(单词)或者数字,与变命名的规则相似。
隐形数组:默认下标是上一个加一
PHP数组特点:
- 可以整数下标或者字符串下标
如果数组下标都为整数:索引数组
如果数组下标都为字符串:关联数组
- 不同下标可以混合存在:混合数组
- 数组元素的顺序可以放入顺序为准,跟下标无关
- 数字下标的自增长特性
- 特殊值下标自动转换
多维数组
多维数组:数组里面的元素又是数组
二维数组
二维数组:数组中所有的元素都是一维数组
多维数组
在第二维的数组元素中可以继续是数组,在PHP中没有维度显示(在php本质没有二维数组)
但是:不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率
异型数组(不规则数组)
异形数组:数组中的元素不规则,有普通基本变量也有数组。
在实际开发中并不常用,尽量让数组元素规则化(便于访问)
数组遍历
数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。
$arr = array(0 => array(‘name’ => ‘Tom’),1=>array(‘name’=>’Jim’)); //二维数组
访问一维元素
$arr[一维下标]
$arr[0]; //结果:array(‘name’=>’Tom’);
//访问二维元素:$arr[一维下标][二维下标]
$arr[1][‘name’]; //Jim
foreach
基本语法如下:
foreach($数组变量 as [$下标 =>]$值){
//通过$下标访问元素的下标;通过$值访问元素的值
}
通常如果是关联数组(字母下标),就需要下标,数字下标就直接选择值。
foreach遍历原理
foreach遍历的原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针。
foreach($arr as $k=>$v){
//循环体
}
- foreach会重置指针:让指针指向第一个元素
- 进入foreach循环;通过指针取得当前第一个元素,然后将下标去除放到对应的下标变量中(如果存在),将值取出来放到对应的值变量中;(指针下移)
- 进入循环内部(循环体),开始执行;
4、指针下移(本质是在第二步,进入循环体之前)
for循环遍历数组
for循环:基于已知边界条件(起始和结束)然后有条件的变化(规律)
因此:for循环遍历数组有对应条件
- 获取数组长度:count(数组)得到数组元素的长度
- 要求数组元素的下标是规律的数字
while配合each和list遍历数组
each函数使用
list函数使用
数组的相关函数
- 排序函数:对数组元素进行排序
sort():顺序排序
rsort():逆向排序
asort():顺序排序
ksort():数组按照键名排序
krsort():下标逆序排序
shuffle():随机打乱
指针函数
reset() 重置指针,将数组指针回到首位
end() 重置指针,将数组指针指到最后一个元素
next() 取得下一个
prev() 指针上移
current() 获取当前对应的元素值
key() 获取当前指针对应的下标值
其他函数
count():统计数组中元素的数量
array_push():从数组中加入一个元素(数组后面)
array_pop():从数组中取出一个元素(数组后面)