(一)基本使用
函数定义形式
function 函数名(形参1,形参2,……){
函数体
}
函数调用形式
1.没有返回值的函数,调用语句是独立语句
函数名(实参1,实参2,…);
2.有返回值的函数,将调用语句当作一个“数据”使用
$v1=函数名(实参1,实参2,…);
$v1=函数名(实参1,实参2,…)*3+6;//参与运算
echo 函数名(实参1,实参2,…);//直接输出
echo 函数名(实参1,实参2,…)*3+6;
$v1=函数名(函数名(),实参1,实参2,…);//可当实参使用
函数调用流程分析
开始调用:实参传数据给形参
程序执行流程进入到函数中(一个独立的运行空间),跟全局执行空间是隔离的
按常规逻辑执行函数中的代码
如果碰到return语句,则终止函数的执行,调回函数开始调用的位置
如果执行到函数最后位置,也同样跳会函数开始调用的位置
(二)函数参数
函数定义时:形参
只在该函数中有效的变量名,函数结束,通常这些变量会销毁
调用时:实参
可以是一个实际数据(5,abc),也可以是一个变量,其作用是将数据赋值给形参
实参与形参一一对应
参数的默认值
定义一个函数时,在形参的位置,可以给形式参数设定默认值
默认值不能是对象或资源类型,只能是常量表达式,或常量,不能是变量。
调用函数时,如果给有默认值的形参传值,则使用传来的数据,不给传数据,则使用默认值
示例:functiongetArea($v,$pi=3.14){ 函数体}
函数的参数传值问题
值传递,引用传递(在形参前加&,实参形式不变)
引用传递时,实参只能是一个变量,引用传值的形参变量,在函数内部改变该形参变量的值,则对应实参变量的值也就改变
函数的数量问题
实参与形参一一对应,如果形参有默认值,实参可以省略
特殊情况:自由参数数量
定义时不给定形参,但调用时,又可以给定任何个数的实参
类似于var_dump()可以传递不定个数的参数:
var_dump($v1);
var_dump($v1,$v2);
这种应用的实现,依赖于系统中的3个系统函数:
func_get_args();//获得一个函数所接收到的所有实参数据,结果是一个数组
func_get_arg(n);//获得一个函数所接收到的第n个实参数据(n从0开始)
func_num_args();//获得一个函数所接收到的所有实参数据的个数
示例:
function getSum()
{
$arr=func_get_args();
$sum=0;
foreach($arr as$value){
$sum+=$value;
}
return $sum;
}
$he1=getSum(1,2);
$he2=getSum(1,2,3);
(三)函数的返回值
使用return语句,其后带一个数据(直接数据、变量数据、表达式结果数据),再返回到该数据的“调用位置”。
通常情况下,函数返回的数据都是以“值传递”的形式,还可以使用引用返回(&)的形式来定义一个函数的返回值形式。形式如下:
function &函数名(形参1,形参2,……)//注意函数名前有个引用符号“&”
{
static $result=0; //初始化(定义为静态变量后,不会随着函数结束而销毁,会持有该值,而且第二次及以后再调用该函数,也不会初始化了)
……
return $result;//返回数据,只能是变量
}
调用函数:$v1=&函数名(实参1,实参2,……)//引用返回的函数,有返回值(即v1与result指向同一个数据)
(四)函数的其他形式
可变函数
可变函数,即函数名“可变”,与可变变量原理相同
$str1=”f1”; //只是一个字符串,内容为“f1”
$v1=$str1(3,4);//形式上看起来是一个变量后面加一个括号,本质是该变量的内容(f1)后面加括号,即这里是调用函数 f1(3,4);
实际应用中,需要根据“用户给定”的数据,来决定调用哪一个函数,比如:
function jpg(){处理jpg图}
function png(){处理png图}
function gif(){处理gif图}
$fileName=get filename(){获取用户上传的图片名}
$houzhui=get_houzhui($fileName);
$houzhui();
匿名函数
匿名函数就是没有名字的函数,有两种形式:
表现1:
$f1=function(){…函数体;}//这里的匿名函数定义形式上没有名字,但其实将其赋值给变量$f1
使用时,与“可变函数”一样:$v1=$f1( );
表现形式2:
调用其他函数(匿名函数,实参1,实参2,。。。)
说明:
此形式的匿名函数只有定义的函数体(无函数名),只能作为其他函数调用时的参数,会在调用其他函数的“过程中”被执行。
能够使用(匿名)函数当作实参的函数,并不多!
其中一个常见的是:call_user_func_array();
其形式为:
call_user_func_array(匿名函数,数组);
含义:将数组的每一项当作匿名函数的实参,传递到该匿名函数中,并执行该匿名函数,可以从匿名函数中返回数据。
示例1:
call_user_func_array(function($m1,$m2){
echo “m1=$m1,m2=$m2”;
},array(1,2));
示例2:
$a1=array(1,2,3);
$func1=function(){
$a=func_get_args();
$sum=0;
foreach($a as $value){
$sum+=$value
}
return $sum;
}
$s= call_user_func_array($func1,$a1);