php再识函数

目录

简介

为了提高开发效率,提升代码的可维护性,相同操作的代码可以封装成一个函数(方法)

函数的结构

  • 关键字 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章