目录
简介
为了提高开发效率,提升代码的可维护性,相同操作的代码可以封装成一个函数(方法)
函数的结构
- 关键字
function
- 函数名,以字母下划线开头,数字字母下划线组成,例如:
getLastSql
- 参数列表 ,圆括号所包括部分,例如:
($a,$b)
- 函数体,花括号所包括的部分,l例如:
{}
- 返回值 return 部分,有的函数没有返回值,返回值类型可以为任何对象,例如:
return $sum;
函数的特性
- 形参与实参
funcction sum($a,$b){ //参数列表里面的两个参数 $a、$b 就是形参 => 函数定义时,参数列表里的参数 return $a + $b; } echo sum(2,3); //函数被调用时的参数被称为实参 注:形参在函数被调用时,才会被系统分配内存空间。一旦函数执行完毕后,形参的内存空间将被释放 当实参参数数量大于等于形参参数数量时,函数会正常执行,否则会报错
- 默认值,
默认值必须是常量表达式,并且默认值参数排在函数参数列表的最后
- 强类型参数:为参数列表中的参数指定类型,如果类型不匹配,则会抛出
TypeError
异常
支持类型的类型有:class/interface name
,array
,callable
,boolean
,float
,string
,int
等,设置强类型参数的时候,不要忘记设置强类型declare(‘strict_types = 1’)
- 可变数量的参数列表
顾名思义就是参数数量可变的参数列表,有两种实现方式
1、func_num_args()
返回参数数量,func_get_arg
返回参数列表中的某一项func_get_args
返回参数列表的的数组
2、...$args
函数的参数都放在了$arg
数组当中- 值传递与引用传递
1、值传递可以理解成单向传递,实参传递给形参,而形参不能传递给实参,在内存中,形参单元与实参单元是不同的单元,在函数被调用时,系统会给形参分配内存空间,执行完毕后,释放形参的内存空间,实参的值保持不变。
2、引用传递,可以理解成双向传递,引用传递不会对形参再次分配内存空间,而是直接是用原来的内存空间,这将会引起相应的之会产生变化。关键字
&
,在函数调用时,不需要再次使用&
- 变量的作用域
变量是有变量范围和生命周期的,按范围来分的话可以分为局部变量和全局变量
局部变量可以分为
1、当前页面中声明的普通变量,不能在函数或者类中起作用
2、当前页面中声明的普通变量,不能被传递到其他页面
3、在函数中生命的普通变量,在函数内部有效
4、在类中声明的属性,在类的内部有效全局变量
global
对于PHP 而言,当前页面声明的变量都是全局变量,对当前页面有效,不能被函数或者类中的方法使用,如果想要使用就需要使用global
关键字,或者$GLOBAL
全局变量,两者的不同点是,global
开辟了新的内存空间,而超全局变量$GLOBAL
使用的原来的内存空间
static
静态变量静态变量仅在局部函数域中存在,函数执行完后,静态变量保留原来的值
function test_static(){ static $a = 0; //静态变量初始化的时候,不能是函数表达式 $a++; return $a; } $a = test_static(); $b = test_static(); $c = test_static(); var_dump($a,$b,$c); 结果依次输出 1,2,3
复杂函数
- 可变函数
变量名后有圆括号,PHP将寻找与变量值相同的函数并执行它
echo、print、unset、isset、empty、require、include等函数是语言结构,不能被用作可变函数
- 嵌套函数
顾名思义,函数中嵌套函数,他独特的特点就是,当外部函数被调用时,内部函数会自动进入全局域中,成为新的定义函数
function out($a){ $a++; function in($b){ $b--; return $b; } return $a; }
- 递归函数
函数在它的函数体内调用它自身,这种函数成为递归函数,作用:分解问题,调用自身
例如:求n的阶乘function recursive($num){ if( $num == 1 ) //特别注意:使用函数递归的时候, return $num; $res = $num * recursive($num - 1); return $res; }
- 匿名函数
匿名函数也称闭包函数,允许创建一个没有指定名称的函数,最经常用作回调函数的参数的值。
function closure($name,Closure $closure){ echo "Hi~ my name is {$name},"; $closure(); } $name = 'Ben'; $age = 'six'; $brief = 'little sexy boy'; closure($name,function() use($age,$brief) { // use 额外的参数变量时,该变量必须定义在use的前面,当然也可使用引用传递进行传值 echo " my age is $age , a $brief"; }); 结果为:Hi~ my name is Ben,my age is six , a little sexy boy