定义形式
function 函数名(形参1,形参2,···){
//函数体
}
调用形式
本质上就是使用一个名字来达到执行其中函数中的代码的作用。调用通常可以分两种情形的调用:
- 第一种:没有返回值的函数,则调用语句是独立语句:
函数名(形参1,形参2,···);
- 第二种:有返回值的函数,则调用语句通常会"混杂"在别的语句中,并将要调用的语句当做一个"数据"来使用。
$value1 = 函数名();
$value2 = 函数名()*3+6;//参与运算后再赋值
echo 函数名();
$valuse3 = 函数名2(函数名(),实参1,实参2,···);函数当做实参来使用
函数参数问题
形参实参
一个函数,在定义函数时叫做形参,只有在该函数调用并执行时有效,函数结束,通常这些变量也将会"销毁"。在调用函数时传的参数叫实参。
函数默认值
//设置形参并设置形参默认值,如果不传带默认值的参数,就取默认值运算
function getArea($r,$PI = 3.14){
$result = $PI * $r * $r;
return $result;
}
$a1 = getArea(1,3.1415926);
//调用函数,并省略带默认值的参数
$a2 = getArea(1);
echo "a1 = $a1,a2 = $a2";
要注意,默认值不能对象或资源类型,只能是常量表达式或常量,不能是变量。
即:正确写法function f1($v1=3)或function f1($v1 = __LINE__)
错误写法function f1($v1=3+1)或$m=3;function f1($v1 = $m)
参数传值问题
实际上,函数的参数传值问题,跟变量之间的传值问题,是一样的规则(模式):默认都是值传递。如果实参本身就是''直接数据",则不存在传值问题,而是简单的"赋值"。
我们也可以让某个参数(形参)以引用传递的方式传值:引用传递形参,在函数内部改变其值,在函数面的实参也会相应改变,类似于C函数中的指针参数。
注意:只有变量才能引用传递,否则报错。
参数的数量问题
通常实参的数量应该跟形参的数量相同,实参跟形参之间是一一对应的。但如果形参设置默认值,则可省略该实参。但php有一种特殊情况:可以有不定形参个数的函数。
func_get_args():获得一个函数所接收到的所有实参,结果是一个数组。
func_get_args(n):获得一个函数所接收到的第n个参数(n从0开始)。
func_num_args():获得一个函数所接收到的所有实参数据的个数
function getSum(){
$arr = func_get_args();//获得所有实参,结果是数组
$sum = 0;
foreach ($arr as $key ) {
$sum += $key;
}
return $sum;
}
$he1 = getSum(1,2);
$he2 = getSum(2,3,2,3);
$he3 = getSum(1,2,5,7);
echo "<br />$he1 $he2 $he3 ";
//结果: 3 10 15
函数返回值
一个函数中,使用return语句,其后带有个数据则该函数就会返回调用函数的位置。函数返回值通常都为"值传递"形式,但也可以让变量数据的值,以"引用传递"的方式返回。
//定义函数时
function &func1(){
static $result = 0; //static修饰后这句话只会运行一次
return $result;
}
//调用函数
$v1 = &func1();
$v1++;
$v2 =&func1();
//$v2结果为1
函数的其他形式
可变函数
可变函数,就是函数名"可变",其实跟可变变量一样。
实际应用中,常常是需要根据"用户给定"的数据,来决定调用哪个函数。例如
function f1($a,$b){···}
$str1 = "f1";
$v1 = $str(3,4);//调用函数f1(3,4)
//实际应用中,常常需要根据"用户给定"的数据,来决定调用哪个函数
function jpg(){处理jpg};
function png(){处理png};
function gif(){处理gif};
$fileName = get_fileName(){获取用户上传的图片名};
$houzhui = get_houzhui($fileName);
$houzhui();
匿名函数
匿名函数即没有名字的函数,两种表现形式:
- 表现形式1:
$f1 = function(){···};
:这里的匿名函数定义形式上没有名字,使用时跟可变函数一样:$v1=$f1();
- 变现形式2:
调用其他函数(匿名函数,实参1,实参2,····);
说明:
1.此形式匿名函数只是定义的函数体(无函数名)
2.此形式匿名函数只能作为其它函数调用时参数
3.此形式匿名函数会在调用其它函数的"过程中"被执行
能够使用(匿名)函数当做实参的参数,并不多,较常见的是:call_user_func_array()
$a1 = array(1,2,3,4,5,6,6);
$s = call_user_func_array(
function(){
$a = func_get_args();
$sum = 0;
foreach ($a as $v) {
echo "<br/>参数:$v";
$sum += $v;
}
return $sum;
}, $a1);
echo "<br/>和为:$s";
变量的作用域
局部作用域:只能在所定义的函数范围内使用。
全局作用域:在函数的"外部"范围使用。
超全局作用域:在程序中都能使用。
静态局部作用域:生命周期与程序生命周期相同。
局部使用全局变量的语法,值为引用传递:
方法1:global
和unset()
方法2:使用
$GLOBALS
超全局数组来引用全局变量,引用传递。全局变量使用局部变量的语法,值为引用传递:
- 通过引用传递的方式向形参传递一个引用实参变量
- 使用函数的引用返回形式
- 函数中使用global关键字来首次引用一个全局变量,则函数结束后在全局范围就可以使用该变量了。
有关函数的系统函数
function_exists():判断某个函数是否被定义过,返回布尔值
func_get_args():获得一个函数所接收到的所有实参,结果是一个数组。
func_get_args(n):获得一个函数所接收到的第n个参数(n从0开始)。
func_num_args():获得一个函数所接收到的所有实参数据的个数