1. 函数的定义

所谓函数,就是将一些有具体功能的语句组织在了一起。定义函数的目的是为了将程序分块。方便使用,管理和阅读,调试

函数的分类:系统定义好了的函数,用户自定义的函数

2. 自定义函数

① 函数的声明

JavaScript里面的语法是一样的:

function   函数名(参数1,参数2,参数3…)

{

//函数体

}

② 函数的调用

调用函数也非常简单,直接函数名(不传/传递相应的参数)

③ 函数的参数

函数的参数分为两种:实际参数(实参),形式参数(形参)

php函数-冯金伟博客园

分形参和实参,在没有传&这个的时候形参是实参的拷贝,

如果是&实参可以改变。

没有实际参数的变量,如写在函数名括号的变量称形参

④ 函数的返回值

可以通过一个return关键字来进行返回,如果没有设置return系统默认返回null

php函数-冯金伟博客园

一个函数是否可以有多个返回值?

函数的返回值,关键字return,但不能有多个return同时返回多个值;

当有多个return返回值时,只会执行第一个然后停止运行;

写在return下面的所有代码都不会执行,但是有些时候,有些程序员会故意将某些代码写在return下面,这些代码叫做花旦。

如果我偏偏就要让一个函数返回多个值,可以通过数组的方式。

⑤函数的工作原理

当我们调用一个函数的时候,事实上就是在内存里面开辟了一个新的栈区,当函数执行完之后,新开辟的栈就会被回收(释放内存)

php函数-冯金伟博客园

当我们调用函数1的时候,内存里面就开辟了一个新的栈,形参就是在这个新栈里面被申明和使用的,当函数1执行完之后,这个栈就会被释放掉,所以它对实参不会有任何影响。如果函数1里面又调用函数2,则又会在内存里面开辟一个新栈。

栈区的特点:先进后出,后进先出       

效率低

3.变量的作用域

JavaScript一样,PHP不支持块级作用域

C语言里面,支持块级作用域

php函数-冯金伟博客园

一对花括号代表一个块级作用域

①局部变量

如果没有函数,那么我们创建的变量可以在页面任何位置使用,但是一旦有了函数,就会有不同的作用域

如下:

 php函数-冯金伟博客园

除了外部无法访问到函数内部的变量以外,函数内部也无法访问全局变量,证明如下:

php函数-冯金伟博客园

效果:

php函数-冯金伟博客园

如果想在函数中访问一个全局变量,也不是没有办法,可以使用global关键字

如下:

php函数-冯金伟博客园

除了上面的方法,还有一个方法,使用PHP内置的(预定义变量)超全局数组$GLOBALS[ ],全局变量的变量名就是键名,变量值就是数组的值

全局变量:

Define<?PHP  声明变量?>

②静态变量

因为如果是在函数里面创建的变量,一旦函数结束,变量就会被销毁,证明如下:

php函数-冯金伟博客园

静态变量的特点就是由于静态变量是放在静态区里面的,所以函数结束后变量不会被销毁。申明静态变量使用关键字static

如下:

php函数-冯金伟博客园

4. 各种形式的PHP函数

① 常规参数函数

所谓常规参数函数,就是实参和形参个数相等,类型一致

 php函数-冯金伟博客园

② 引用参数函数

所谓引用参数,就是将参数的地址传递给函数,这个时候,函数里面的形参和实参都是指向同一个地址,这个时候,相当于两个是被绑定在一起的,形参一改,实参也就被修改了

 php函数-冯金伟博客园

需要注意一个地方:在C语言里面,如果传递的是一个数组,那么传递的是地址过去,但是在PHP里面传递数组仍然是传递值过去

如下:

php函数-冯金伟博客园

如果想要传递数组的地址,仍然是形参前面加一个&就可以了,如下:

php函数-冯金伟博客园

PHP里面,有很多这样的引用传参的函数,例如:sort()函数,进行排序的函数,返回新数组,原来数组的顺序会改变

 php函数-冯金伟博客园

③ 默认参数函数

所谓默认函数参数,就是可以给函数指定一个默认参数值,当我们调用函数的时候,如果传过来了实参,就用实参,如果没有,就用默认的参数值

 php函数-冯金伟博客园

案例2

php函数-冯金伟博客园

④ 参数个数可变函数

所谓参数个数可变函数,就是根据函数传过来的参数个数来执行业务。有一点像JS里面的函数重载。

func_num_args():该函数的返回值是一个整数,数组里面装的是传递过来的实参的个数

php函数-冯金伟博客园

func_get_args()函数:返回值也是一个数组,数组里面装的就是传递过来的参数的值

php函数-冯金伟博客园

⑤ 回调函数

所谓回调函数,就是将一个函数A作为参数传递给另外一个函数B,然后在函数B里面再执行函数A

在学习回调函数之前,我们需要先学习变量函数

所谓变量函数,就是将函数赋值给一个变量,然后变量名后面加上一对括号,PHP系统会自动检测是否为函数。如果是的话就会执行该函数

php函数-冯金伟博客园

接下来再来看回调函数,将函数作为参数传递到另外一个函数里面

php函数-冯金伟博客园

PHP里面,实现回调函数还有一种方法,通过系统函数call_user_func_array()

call_user_func_array(“函数名”,装有参数的数组)

如下:

php函数-冯金伟博客园

php函数-冯金伟博客园

⑥ 匿名函数(闭包函数)

所谓匿名函数,就是没有名字的函数

需要将匿名函数赋值给一个变量,这个时候直接在变量名后面加上一对括号,就可以调用这个匿名函数了

php函数-冯金伟博客园

PHP里面的匿名函数又被称之为闭包函数

⑦ 递归函数

所谓递归函数,就是直接或者间接的调用自己。

递归函数最大的好处在于精简程序中繁杂重复调用的函数。但是使用递归会大量消耗内存,所以一般不建议使用递归。

 php函数-冯金伟博客园

练习:使用递归实现从1+100求和

 php函数-冯金伟博客园

5. 自定义函数库

有些时候,我们不仅仅只是使用系统提供给我们的函数,我们还会自己写一套函数。

如果要将自己写的php函数库包含进来,我们可以使用include关键字

Hanshuku.php代码

php函数-冯金伟博客园

Test.php代码

 php函数-冯金伟博客园

除了include关键字以外,还有一个叫做require的关键字,也可以将自己定义的函数库包含进来

如下:

php函数-冯金伟博客园

Requireinclude的区别:

Require当遇到错误的时候,会直接停止脚本,include遇到错误,会给出警告,但是不会停止脚本

如下:require会终止脚本,后面的代码不会被执行

php函数-冯金伟博客园

效果:

php函数-冯金伟博客园

Include则会只是给出警告,但是后面的代码会继续执行

 php函数-冯金伟博客园

效果:

php函数-冯金伟博客园

Include_oncerequire_once:基本功能和上面的requireinclude功能是一样的,但是如果该文件里面的代码已经被包含了,则不会再次包含,once会判断次数只能包含一次

如下:

php函数-冯金伟博客园