函数的基本概念
函数:function,是一种语法结构,将实现某一种功能的代码块(多行代码)分装到一个结构中,从而实现代码的重复利用(复用)
函数定义语法
函数有几个对应的关键点:function关键字、函数值、参数(形参和实参),函数体和返回值
基本语法如下:
function 函数名(参数){
//函数体
//返回值:return结果
}
定义函数的目的:是为了实现代码的重复利用,一个功能一个函数
函数的使用:
通过访问函数的名字+()
//如果函数在定义的过程中有参数,那么在调用的时候必须传入对应的参数
函数调用
函数是一种结构不会自动执行,只有调用才会执行
函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段
函数调用的特点:只要系统在内存中能够找到对应的函数,就可以执行()函数的调用可以在函数定义之前
函数执行的内存分析
- 读取代码进入代码段(编译:将代码编译字节码存储到内存)
- 根据代码逐行执行,(上图代码中先调用函数再执行不会报错:调用的时候已经能在内存中找到这个函数)
以上原因:编译和执行是分开的(先编译后执行)
函数命名规范
命名规范:由字母、数字、下划线组成,但是不能以数字开头
函数作为一种常用的结构,一般遵循以下规则:函数通常名字代表着函数的功能,而有些功能会比较复杂,可能一个单词不足以表示,需要多个组合
- 驼峰法:除了左边第一个单词外,后面所有的单词首字母大写:showParentInfo()
- 下划线法:单词之间通过下划线连接,单词都是小写show_parent_info()
函数名字:在一个脚本周期中,不允许出现同名函数(通常在一个系统不会使用同名函数)
参数详解
函数的参数分为两种:形参和实参
形参
形式参数,不具有实际意义的参数,是在函数定义时使用的参数
实参
实际参数,具有实际数据意义的参数,是在函数调用的时候使用的参数
形参是实参的载体,实参在调用时通常是需要传入到函数内部参与计算(运算),那么需要在函数内部去找到实际数据所在的位置,才能找到数据本身:需要实际调用的时候,将数据与实参形式传递给形参,给形参赋值,从而使得函数内部可以用到外部数据
注意:
1.在PHP中允许实参多于形参(个数)函数内部不用而已,不会报错
2.在PHP中理论上形参个数没有限制(实际开发不会太多)
3.实参不能少于形参
默认值
默认值:defeat value,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值:如果实际调用传入的参数(实参)没有提供,那么形参的值就使用初始赋值来进入函数内部参与运算
注意是值传递,num1的值不变
通常默认值是用在一些,一定会有某个数据参与,但是可能是某个我们知道的值
注意事项:
1.默认值的定义是放在最后的(多个),不能左边形参有默认值但是右边没有
2.函数外部定义的变量名字与函数定义的形参名字冲突(同名)是没有任何关联关系的
3.如果多个函数使用同样的形参名字也不冲突
参数传递
- 值传递
实参在调用时会将值赋值给形参,那么实际上使用的方式是简单的值传递,将实参(数据或者变量或者常量或者其他表达式)的结果(值)取出赋值给形参:形参与外部实际传入的参数本身没有任何关联关系 - 引用传递
有的时候,希望在函数内部拿到的外部数据,能在函数内部改变,函数才会在调用的时候去主动获取外部数据的内存地址。以上这种定义形式参数的方式叫做引用传值
基本定义语法
function函数名(形参1,&形参2){
}//函数名
在调用的时候,必须给引用传值的参数位置传入实际参数,而且参数本身必须是变量。(变量才有指向的数据的内存地址)
对比发现$num1使用的是值传递(在函数调用后本身的值没有变化,只是在函数内部发生) $num2用了取地址,是引用传递,函数内部的参数取到了$num2的地址,函数内部$num2值发生变化,外部也会发生变化
引用传值注意事项:
在传入实参的时候必须传入变量
致命错误:只有变量能够引用传递< /center>
函数返回值
PHP中函数都有返回值,默认返回NULL

return关键字:
- return在函数内部存在的价值:返回当前函数的结果,当前函数运行结束
- 函数还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置,并终止后面的代码(通常在系统配置文件中使用较多)
作用域
作用域:变量(常量)能够被访问的区域
- 变量可以在普通代码中定义
- 变量也可以在函数内部定义
在php中作用域严格来说分为两种;但是PHP内部划定一一些在严格意义之外的一种,所有总共算3种 - 全局变量:就是用户普通定义的变量(函数外部定义)
所全局空间:在PHP中只允许在全局空间使用:理论上函数内部不可访问
脚本周期:直到脚本运行结束(最后一行代码) - 局部变量:就是在函数内部定义的变量
所属当前函数空间:在PHP中只允许在当前函数自己内部使用
函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行) - 超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等)
所超全局空间:没有访问限制(函数内外均可访问)让局部访问全局(一般不使用)的办法
如果想函数内部是使用外部变量,除了$GLOBALS之外,通过参数传值(如果要统一值,还可以使用引用传值)
在PHP中还有一种方式,能够实现全局访问局部,同时局部也可以访问全局:global关键字
global关键字:
是一种在函数里面定义变量的一种方式
- 如果使用global定义的变量名在外部存在(全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一个变量)
- 如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量
本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有。
基本语法
global 变量名;//不能赋值
变量名=值 //修改
虽然以上方式可以实现局部与全局的互访,但是通常不会这么用。一般如果会存在特殊使用,也会使用参数的形式来访问。(还可以使用常量:define定义的)
静态变量
静态变量:static,是在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据的变量:函数运行结束后所有的局部变量会清空,如果重新运行一下函数,所有的局部变量又会重新初始化
function 函数名()
{
static $变量名=值 //通常会在定义的时候就赋值
}
静态变量的作用是为了跨函数共享数据(同一个函数被多次调用)
静态变量的使用
- 为了统计:当前函数被调用的次数(有没有替换方法)
- 为了统筹函数多次调用得到的不同结果(递归思想)
可变函数
可变函数:当前有一个变量所保存的值,刚好是一个函数的名字你,那么就可以使用变量+()来充当函数名使用
定义:
$变量 = ‘display’
function display(){
}
可变函数在系统使用的过程中还是比较多的,尤其是使用很多系统函数的时候:需要用户在外部定义一个自定义函数,但是是需要传入到系统函数内部使用。
匿名函数
基本概念
匿名函数:没有名字的函数
基本语法:
变量名=function(){
函数体
}
变量保存匿名函数,本质得到的是一个对象(closure)
闭包
闭包closure,一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)
简单理解:函数内部有一些局部变量(要执行的代码块)在执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:通常用匿名函数)
证明:函数的局部变量在函数使用完之后没有被释放?
- 使用内部匿名函数
- 匿名函数使用局部变量:use
- 匿名函数被返回给外部使用
伪类型
伪类型:假类型,实际在PHP中不存在的类型,通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习
伪类型主要有两种:在三大类八小类之外
mixed:混合的,可以是多种PHP中的数据类型
number:数值的,可以是任意数值类型(整形和浮点型)
常用系统函数
有关输出的函数
print:类似于echo输出提供的内容,本质是一种结构(不是函数,)返回1,可以不需要使用括号
print_r:类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印比较多)
注意图中的1是print返回的1被echo输出的
有关时间的函数:
1.date ( string $format [, int $timestamp ] )
返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()。
按照指定格式对对应的时间(从1970年格林威治时间开始计算的时间),如果没有指定特定的时间戳,那么就是默认解释当前时间戳
time()获取当前时间对应的时间戳
其中的参数format
2.microtime()获取微妙级别的时间戳mixed microtime ([ bool $get_as_float ] )
microtime() 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。
如果调用时不带可选参数,本函数以 “msec sec” 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
如果给出了 get_as_float 参数并且其值等价于 TRUE,microtime() 将返回一个浮点数。
3.strtotime():按照规定格式的字符串转换为时间戳(将任何字符串的日期时间描述解析为 Unix 时间戳)
有关数学的函数
max()
min()
rand()得到一个指定区间的随机数(整数)
mt_rand:与rand一眼,只是底层结构不一样,效率比rand高(建议使用)
round()四舍五入
cell()向上取整
floor()
pow():求指定数字的指定制数次结构,例如pow(2,8)=256
abs 求绝对值
sqrt 求平方
有关函数的函数
function_exists()判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
func_get_arg()在自定义函数中去获取指定数值对应的参数
func_get_args()在自定义函数中去获取所有的参数(数组)
func_num_args():获取当前自定义函数的参数数量