1. 函数的定义
所谓函数,就是将一些有具体功能的语句组织在了一起。定义函数的目的是为了将程序分块。方便使用,管理和阅读,调试
函数的分类:系统定义好了的函数,用户自定义的函数
2. 自定义函数
① 函数的声明
和JavaScript里面的语法是一样的:
function 函数名(参数1,参数2,参数3…)
{
//函数体
}
② 函数的调用
调用函数也非常简单,直接函数名(不传/传递相应的参数)
③ 函数的参数
函数的参数分为两种:实际参数(实参),形式参数(形参)
分形参和实参,在没有传&这个的时候形参是实参的拷贝,
如果是&实参可以改变。
没有实际参数的变量,如写在函数名括号的变量称形参
④ 函数的返回值
可以通过一个return关键字来进行返回,如果没有设置return,系统默认返回null
一个函数是否可以有多个返回值?
函数的返回值,关键字return,但不能有多个return同时返回多个值;
当有多个return返回值时,只会执行第一个然后停止运行;
写在return下面的所有代码都不会执行,但是有些时候,有些程序员会故意将某些代码写在return下面,这些代码叫做花旦。
如果我偏偏就要让一个函数返回多个值,可以通过数组的方式。
⑤函数的工作原理
当我们调用一个函数的时候,事实上就是在内存里面开辟了一个新的栈区,当函数执行完之后,新开辟的栈就会被回收(释放内存)。
当我们调用函数1的时候,内存里面就开辟了一个新的栈,形参就是在这个新栈里面被申明和使用的,当函数1执行完之后,这个栈就会被释放掉,所以它对实参不会有任何影响。如果函数1里面又调用函数2,则又会在内存里面开辟一个新栈。
栈区的特点:先进后出,后进先出
效率低
3.变量的作用域
和JavaScript一样,PHP不支持块级作用域
在C语言里面,支持块级作用域
一对花括号代表一个块级作用域
①局部变量
如果没有函数,那么我们创建的变量可以在页面任何位置使用,但是一旦有了函数,就会有不同的作用域
如下:
除了外部无法访问到函数内部的变量以外,函数内部也无法访问全局变量,证明如下:
效果:
如果想在函数中访问一个全局变量,也不是没有办法,可以使用global关键字
如下:
除了上面的方法,还有一个方法,使用PHP内置的(预定义变量)超全局数组$GLOBALS[ ],全局变量的变量名就是键名,变量值就是数组的值
全局变量:
Define,<?PHP 声明变量?>
②静态变量
因为如果是在函数里面创建的变量,一旦函数结束,变量就会被销毁,证明如下:
静态变量的特点就是由于静态变量是放在静态区里面的,所以函数结束后变量不会被销毁。申明静态变量使用关键字static
如下:
4. 各种形式的PHP函数
① 常规参数函数
所谓常规参数函数,就是实参和形参个数相等,类型一致
② 引用参数函数
所谓引用参数,就是将参数的地址传递给函数,这个时候,函数里面的形参和实参都是指向同一个地址,这个时候,相当于两个是被绑定在一起的,形参一改,实参也就被修改了
需要注意一个地方:在C语言里面,如果传递的是一个数组,那么传递的是地址过去,但是在PHP里面传递数组仍然是传递值过去
如下:
如果想要传递数组的地址,仍然是形参前面加一个&就可以了,如下:
在PHP里面,有很多这样的引用传参的函数,例如:sort()函数,进行排序的函数,返回新数组,原来数组的顺序会改变
③ 默认参数函数
所谓默认函数参数,就是可以给函数指定一个默认参数值,当我们调用函数的时候,如果传过来了实参,就用实参,如果没有,就用默认的参数值
案例2:
④ 参数个数可变函数
所谓参数个数可变函数,就是根据函数传过来的参数个数来执行业务。有一点像JS里面的函数重载。
func_num_args():该函数的返回值是一个整数,数组里面装的是传递过来的实参的个数
func_get_args()函数:返回值也是一个数组,数组里面装的就是传递过来的参数的值
⑤ 回调函数
所谓回调函数,就是将一个函数A作为参数传递给另外一个函数B,然后在函数B里面再执行函数A。
在学习回调函数之前,我们需要先学习变量函数
所谓变量函数,就是将函数赋值给一个变量,然后变量名后面加上一对括号,PHP系统会自动检测是否为函数。如果是的话就会执行该函数
接下来再来看回调函数,将函数作为参数传递到另外一个函数里面
在PHP里面,实现回调函数还有一种方法,通过系统函数call_user_func_array()
call_user_func_array(“函数名”,装有参数的数组)
如下:
⑥ 匿名函数(闭包函数)
所谓匿名函数,就是没有名字的函数
需要将匿名函数赋值给一个变量,这个时候直接在变量名后面加上一对括号,就可以调用这个匿名函数了
PHP里面的匿名函数又被称之为闭包函数
⑦ 递归函数
所谓递归函数,就是直接或者间接的调用自己。
递归函数最大的好处在于精简程序中繁杂重复调用的函数。但是使用递归会大量消耗内存,所以一般不建议使用递归。
练习:使用递归实现从1+100求和
5. 自定义函数库
有些时候,我们不仅仅只是使用系统提供给我们的函数,我们还会自己写一套函数。
如果要将自己写的php函数库包含进来,我们可以使用include关键字
Hanshuku.php代码
Test.php代码
除了include关键字以外,还有一个叫做require的关键字,也可以将自己定义的函数库包含进来
如下:
Require和include的区别:
Require当遇到错误的时候,会直接停止脚本,include遇到错误,会给出警告,但是不会停止脚本
如下:require会终止脚本,后面的代码不会被执行
效果:
Include则会只是给出警告,但是后面的代码会继续执行
效果:
Include_once和require_once:基本功能和上面的require与include功能是一样的,但是如果该文件里面的代码已经被包含了,则不会再次包含,once会判断次数只能包含一次
如下: