今天我们主要学了函数的相关知识,是个比较基础的知识,但也是很重要的。
一、函数
函数就类似于一个工具,我们写好函数之后可以直接进行调用,可以很大的减少代码的从用性,提高页面性能和可读性。
1.函数的定义
在php中函数的定义方式为:
function name($形参1,$形参2.....){
要执行的代码
return 123;
}
在上方的函数定义式中,name代表函数名,小括号内是形参,是用来传递参数,花括号中的就是调用时需要执行的代码。
函数的调用方式:
name(实参1,实参2,......)
当代码读到name(实参1,实参2,......)时,就会执行上述定义函数中花括号的内容,其中实参就会通过形参传递到函数内部,用来参与运算。花括号中如果有return则函数有返回值,返回值为return后跟的值;
当调用函数时,如果不进行传递参数,可以给形参设置默认值:
function name($x=1,$y=2){......}
当在调用这个函数时,不进行传参,则函数运行中默认$x=1,$y=2;
2.形参的传值问题:
值传递:默认的方式,如果没有特别的设定,参数传值都是值传递。
引用传递:需要在形参的前面加&符号:
那么我们来看看以前学过的什么是值传递(拷贝传值)和引用传递:
3.函数参数的数量问题
通常函数调用时的实参数量,应该跟函数定义时的形参数量一致,如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略,注意:省略只能从右往左进行。
有一种定义和使用函数的特别形式(并不常见):它不定义形参,而实参任意给出,这种函数系统中也经常见到比如:
ver_dump($v1);
var_dump($v1,$v2,$v3);
我们自己也可以定义这种函数:
在函数内部调用系统函数,func_get_args(),所有的实参数据都会放入一个数组中:
$arr = func_get_args(); //获取实参数据列表
func_get_arg($i); // 获得第$i个实参,$i从零开始
func_num_args(); //获取是实参的个数
二、函数的其他形式
1.可变函数
在之前我们学习过可变变量:一个变量的名字还是一个变量。
与可变变量一样,一个函数的名字也是一个变量;
可变变量的运用
2.匿名函数
匿名函数就是指没有名字的函数。匿名函数的形式有两种,
形式1:将一个匿名函数“赋值”给一个变量。
$a = function (){
echo "这是一个匿名函数"
}; //注意:这里要用分号
$a(); //函数的调用。
//匿名参数也可以带参数,也可有返回值,使用和正常函数差不多。
形式2:将匿名函数当做实参来使用,如下图:
三、函数的作用域
变量的作用域,就是指:一个变量在什么范围中可以使用的情况。php中作用域有三个分别是局部作用域,超全局作用域,全局作用域;
1.局部作用域
就是指一个函数的内部范围。对应的变量就是局部变量。
局部变量会在函数执行结束时候会将变量销毁,下次调用会还是原来的值。不过有个例外,那就是静态局部变量,在变量名称之前添加static,那么这个变量就不会被销毁。可以用来比如:
function fn() {
static $c = 0; //此时就是静态局部变量,他的值会保留。
}
举个例子:
2.超全局作用域
就是指所有的代码范围。对应的变量就是超全局变量。其实只有系统预定义的几个:$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_SESSION, $_COOKIE, $_FILES
3.全局作用域
就是不在函数内部的范围----函数外部。对应的变量就是全局变量。
注意:
1)通常情况下全局范围不能访问局部变量。
2)局部范围不能访问全局变量。
那么,如何在局部区域使用全局变量呢?
1)我们可以在函数中,使用global关键字来声明一个要使用的全局变量的同名局部变量。
需要注意的是:其实函数内部的$v4是局部变量,函数外的$v4是全局变量,两个变量不同,但是指向是相同的(也就是引用关系)
2)使用$GLOBALS超全局变量,可以认为是全局变量的另一种使用方式。
但是,如果我们队$GLOBALS变量的某个单元(也就是下标)进行unset,则其就会完全对应销毁,这是因为$GLOBALS对全局变量的使用可以看做是全局变量的另一种语法形式而已,而不是引用关系。如图:
四、函数的编程思想
1.递归思想----递归函数
递归函数就是一个函数内部调用它自己的函数!
function fn($n){
echo $n;
fn($n);
}
fn();
从上面的这个函数来看,这个函数是死循环,在项目中不能这样使用,我们需要让他按照我们的要求停下来。
运用递归函数来求n的阶乘;
function fn1($n){
if($n==1){
return 1;
}
$res = $n*fn1($n-1);
}
fn1(n);
递归思想总结:当面对一个大问题时,该大问题可以经由该问题的“小一级问题”而经过简单计算获得,而且,可以获知这类问题的“最小一级问题”答案,则此时就可以用递归思想来解决。
2.递推(迭代)思想
递推的思想就是:最小的问题是已经解决,一级一级向上解决,直到解决完问题:
$a = 1;
for($n=2;$n<=5;++$n){
$res = $n*$a;
$a = $res;
}
echo $res;
当一个问题既可以用递推和递归同事能解决问题,我们需要优先选用递推思想,因为递归的思想更消耗资源。
好了,今天的学习就到这里,我们明天继续。