函数不区分大小写;
函数参数传递方式:值传递,引用传递(定义的时候使用&,调用的时候就不需要添加了)
//关于函数参数的传递 //值传递 function foo(&$x){ $x = $x + 50; } $x = 200; foo($x); echo $x; //结果是250
关于可变参数:php中没有函数重载,可变参数是指参数的个数是变化的。
func_num_args()//获取参数的个数;
func_get_args()//获取所有的参数,返回的是一个数组
func_get_arr(int)//获取数组中执行下边的数
//对若干个数求和,比如add(2,3),add(2,3,4),add(2,3,4,5,6,7) //可变参数,指的是参数的个数是变化的 //func_num_args():获取参数的个数 //func_get_args():获取所有的参数,返回的是一个数组 //func_get_arg(int):获取数组中指定下标的数 function add(){ //测试传参个数 //echo func_num_args(); //测试获取所有的参数 //print_r(func_get_args()); //测试一下具体获取某一个 //echo func_get_arg(3); $sum = 0; for($i = 0; $i < func_num_args(); $i++){ $sum += func_get_arg($i); } return $sum; } //echo add(2,3,4,5,6,7); echo add(2,3,4);
递归:
递归需要注意细节:
1、递归不能无限制的调用下去,因为栈空间是有限的,应有停止条件。
2、递归中必须有完成终极任务的语句序列,使函数有意义,比如 return 1;
3、递归函数当然要有递归语句了;
4、递归应先测试条件,再递归调用;
递归的优缺点:
优点:结构清晰,可读性强;
缺点:不好理解,运行的效率低,占用空间和时间都比非递归函数多
<?php //函数递归案例分析 test(10); function test($n){ echo $n." "; if($n > 0){ test($n-1); }else{ echo "----- "; } echo $n." "; } //结果是10 9 8 7 6 5 4 3 2 1 0 ----- 0 1 2 3 4 5 6 7 8 9 10 ?>
//简单但容易出错的笔试题 demo(10); function demo($n){ if($n > 0){ demo((int)($n/2)); } echo $n."<br />"; } //输出结果是:0,1 2 5 10
<?php //使用递归实现10!注意0! = 1 function fac($n){ if($n > 0){ return $n*fac($n -1); }else{ return 1; } } echo fac(7); ?>
<?php //函数的默认值:从右开始设置默认值 header("Content-type:text/html; charset=utf-8"); function show($name,$age,$gender="保密",$nationality="中国"){ echo "姓名:".$name."<br />"; echo "年龄:".$age."<br />"; echo "性别:".$gender."<br />"; echo "国籍:".$nationality; } show("zhangsan",31,"女"); ?>
内存空间分配如下:
栈,通常存放局部变量(函数)
堆,动态申请的空间,new
函数的调用机制:
函数的调用和栈息息相关。
栈是内存的存储空间的一种分配方式,物理上。 栈是一种数据结构,后进先出。
函数的调用实际上就是入栈和出栈的过程。
函数的步骤:
① 建立被调函数的栈空间,其大小由函数体定义的数据量来决定。
② 保护调用函数的运行状态和返回地址
③ 传递参数
④ 将控制权转交给被调函数
⑤ 函数运行完成后,复制返回值到函数数据块底部
⑥ 恢复调用函数的运行状态
⑦ 返回调用函数
静态变量static
php中静态属性只能被初始化为一个字符值或常量,不能使用表达式
静态变量存放在内存中静态变量的存储区域,只在第一次赋值的时候进行初始化。
一个经典面试题:
include、require、include_once、require_once之间的区别?
1、require要求更加严格,如果程序出错(包含文件不存在或者无法访问的时候)会停止程序的执行;
include程序出错,输出错误,会继续执行后面的代码;
这两种结构除了在如何处理失败之外完全一样,include()产生一个警告,而require()则导致一个致命 错误;
2、include和include_once之间的区别
使用include_once如果前面已经包含过,则不再包含,如果使用include重复包含的时候会出错;
Require和require_once之间的区别和Include和include_once相同。
有四个,到底用哪一个?
require_once,
严格检查,如果包含的文件不存在或无法访问,则会报错,停止程序的运行,同时避免了重复包含的 问题。性能方面会有一丁点的影响,因为做了额外的操作(检测是否已经包含过了)。
在php中全局变量时用global来修饰;