一、基本概念
①函数是模块化程序的产物,在实际开发过程中,将一个项目划分为各个大的功能模块,同时大的功能模块划分为小的功能,再使用函数将这个最小的功能(一个动作)实现。
②从代码上看,函数就是使用{ } ,将完成某一功能的代码括起来(封装),再使用function关键字,为这个代码设置一个名字,这个名字就是函数名,函数名后必须有(),这个()表示函数只能被调用。
二、声明语法
function funName(形参列表){
函数体
【return】值
}
三、函数调用:funName(实参列表)
四、函数名
①PHP中函数名是不区分大小写的,但是建议驼峰式命名
②函数名的命名规则和变量的命名规则相同,只能包含字母、数字、下划线、而且以字母或者下划线开头
<?php //函数的声明 function creatTable(){ $tab="<table border='1' rules='all' width='500' height='300'>"; for($row=1;$row<=10;$row++){ $tab.="<tr>"; for($col=1;$col<=10;$col++){ $tab.="<td>数据</td>"; } $tab.="</tr>"; } $tab.="</table>"; echo $tab; } //函数的调用 creatTable(); ?>
五、可变函数
①概念:如果$a变量的值是另一个函数名,那么可以使用这个变量来访问函数
<?php //函数的声明 function creatTable(){ $tab="<table border='1' rules='all' width='500' height='300'>"; for($row=1;$row<=10;$row++){ $tab.="<tr>"; for($col=1;$col<=10;$col++){ $tab.="<td>数据</td>"; } $tab.="</tr>"; } $tab.="</table>"; echo $tab; } //可变函数 $func='creatTable'; $func(); ?>
②使用场景:将收到的数据保存在一个变量中,再用可变变量动态的调用函数
<?php //函数的声明 function creatTable(){ $tab="<table border='1' rules='all' width='500' height='300'>"; for($row=1;$row<=10;$row++){ $tab.="<tr>"; for($col=1;$col<=10;$col++){ $tab.="<td>数据</td>"; } $tab.="</tr>"; } $tab.="</table>"; echo $tab; } //在地址栏中模拟get方式传递数据,将收到的数据保存在一个变量中,再用可变变量动态的调用函数 $f=$_GET['f']; $f(); ?>
六、函数的参数
①形参:函数定义时的参数就是形参,形参只对内部有效,对外无效,形参是被动的接受数据
②实参:函数调用时的参数就是实参,实参主动向函数内部传递实际的数据,形参和实参让函数更具有调用性
<?php function showInfo($i){//形参 $i=20; //内部访问 echo $i; } $a=10; showInfo($a);//实参--------过程:$a=10-->$i=$a=10----->进入函数$i=20---->输出$i=20 //尝试访问 echo $i; ?>
③形参的默认值:
- PHP中定义函数时可以为形参赋值一个值,这个值就是形参的默认值,一般具有默认值的形参位于形参列表的最后位置
<?php function showInfo($v1,$v2=100){ echo $v1+$v2; } $a=10; $b=20; showInfo($a);//110 showInfo($a,$b);//30 ?>
- 如有为具有默认值的形参传递数据,那么这个形参使用实际传递过来的数据
<?php function showInfo($v1,$v2){ $v1=100; $v2=200; echo $v1,'<br>',$v2,'<br>'; } $a=10; $b=20; showInfo($a,$b); echo $a,'<br>',$b;
④引用传值:PHP中可以在形参前加$符号,将实参之间默认的赋值传值,更改为引用传值
<?php function showInfo(&$v1,&$v2){ $v1=100; $v2=200; echo $v1,'<br>',$v2,'<br>'; } $a=10; $b=20; showInfo($a,$b); echo $a,'<br>',$b; ?>
七、函数体:完成某一功能的代码段
八、return语句
①在使用函数完成某一些功能时,有时会将函数计算的数据传递出来,此时可以使用return
②程序是用于处理数据的,函数所处理的数据具有两个方向,其一从外到内,使用实参和形参,其二,从内到外,使用return
③函数内部可以有多个return,只要遇到一个return,就会中断函数的执行,函数内部也可以省略return语句
九、匿名函数
①没有名字的函数就是匿名函数,也称之为闭包函数,如果是匿名函数,必须以分号结尾
<?php function(){ echo __FUNCTION__; };//------必须有分号结尾 ?>
②JavaScript中的函数可以自调用,但是PHP中的函数没有办法自调用
③PHP中的匿名函数,可以赋值给另外一个变量
<?php $fn=function(){ echo __FUNCTION__; }; $fn();//{closure} ?>
④PHP中的匿名函数还可以用于某个函数的参数,这就是回调函数callback:在实际开发中,使用别人的函数或者系统函数,函数需要传入参数,作为参数传递的函数就是回调函数
<?php function showInfo($fn){ $fn(); } showInfo(function(){ echo 'helllo'; });//helllo ?>
十、伪类型( 是 PHP 文档里用于指示参数可以使用的类型和值)
①mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。说明函数返回值不是一个确定的类型。
②callback 表示回调函数
③scalar 如果是int、float、string、bool
十一、相关函数(系统函数)
①func_get_args( ) 用于获取实参,并以数组形式返回
②func_get_arg( ind) 用于获取ind小标指定的实参
③func_num_args( ) 用于获取实参的个数
<?php function getArg(){ echo '实参的个数为:',func_num_args(),'<br>'; echo '第一个实参为:',func_get_arg(0),'<br>'; echo '<pre>所有的实参如下:'; print_r(func_get_args()); } getArg(10,20,30); ?>
<?php //例:求n个数的和,参数未知----第一种方法 function getSum(){ $sum=0; $count=func_num_args(); $arguments=func_get_args(); for($i=0;$i<$count;$i++){ $sum+=$arguments[$i]; } return $sum; } echo getSum(10,20,30,40);//100 ?>
<?php //例:求n个数的和,参数未知----第二种方法 function getSum(...$args){ //print_r ($args);---Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 ) 100 $sum=0; for($i=0;$i<count($args);$i++){ $sum+=$args[$i]; } return $sum; } echo getSum(10,20,30,40);//100 ?>
十二、函数运行的内存原理
十三、作用域
①定义:在PHP中函数是用于封装某一功能的代码段,函数在对代码进行封装会有一些影响,php中分两种作用域,全局作用域和局部作用域
②全局作用域和全局变量:在函数外部定义的变量,其作用域就是全局作用域,变量就是全局变量
<?php $i=10;//全局变量 echo $i;//10 function showInfo(){ echo $i; } showInfo();//Notice: Undefined variable: i in E:\WAMP\Apache2.4\htdocs\test.php on line 5 //提示:函数内部无法访问全局变量 ?>
③局部作用域和局部变量:在函数外部定义的变量,其作用域就是局部作用域,变量就是局部变量
<?php function showInfo(){ $i=100;//局部变量 echo $i; } showInfo();//100 echo $i;//Notice: Undefined variable: i in E:\WAMP\Apache2.4\htdocs\test.php on line 7 //提示:外部也不能访问局部变量 ?>
④提示:默认PHP中有很清晰的作用域,外部只能访问外部的,内部只能访问内部的,这一点和JavaScript有所不同
⑤外部访问内部或者内部访问外部的方法
- 通过参数的引用传值方式(形参前面加&符号)实现内部的局部变量访问外部的全局变量
<?php $i=10; function showInfo(&$p){ $p=100; echo $p,'<br>'; } showInfo($i);//100 echo $i;//100------原本应该输出的是10,通过引用传值的方法,改变了$i的值 ?>
- 通过GLOBALS可以实现内部的局部变量访问外部的全局变量
<?php //通过$GLOBALS可以实现内部访问外部的全局变量 $name="Eric"; $age=20; function showInfo(){ echo $GLOBALS['name'],'<br>'; echo $GLOBALS['age'],'<br>'; } showInfo();//Eric 20 ?>
- global关键字方法可以实现内外互访,语法是global变量名,在函数内部建立一个与函数外部同名的变量引用,如果外部没有这样的同名变量,会在外部创建一个同名的变量
<?php //global实现内部访问外部 $name="Eric"; function showName(){ global $name; echo $name,'<br>'; } showName();//Eric echo $name;//Eric //global实现外部访问内部 function showAge(){ global $age; $age=20; echo $age,'<br>'; } showAge();//20 echo $age;//20 ?>
⑥常量的作用域:常量没有作用域的限制,一个脚本的常量,在任何的位置都就可以访问
⑦预定义变量(超全局变量):不受作用域的限制
十四、变量的生命周期
①作用域与生命周期:作用域表示的是一个变量的作用空间范围,生命周期表示的是一个变量的作用时间范围
②全局变量的生命周期:从脚本执行开始开始到脚本执行结束
③局部变量的生命周期:从函数执行开始到函数执行结束
十五、静态变量
①定义:在函数内部使用,static声明的变量
<?php function showInfo(){ static $i=1; $i++; echo $i,'<br>'; } showInfo();//2 showInfo();//3 showInfo();//4 showInfo();//5 ?>
②原理:静态变量在函数多次被调用同时只会被初始化一次,并且静态变量的值不会随着函数的执行而被回收
③提示:静态变量的使用场景,如果想在同一个函数多次调用时,共享一份数据
十六、日期时间函数
①time()用于获取当前时间戳,单位秒,从1970年1月1日0时0分0秒开始算起
②microtime()单位,毫秒
<?php echo time(), '<br>';//1528703394 echo microtime();//0.43992100 1528703394 ?>
③date()用于格式化时间信息
<?php echo date('y-m-d H:i:s');//18-06-11 15:53:04 //语法:date(format【,time】) //time表示所要格式化的时间戳,如果省略表示对当前时间进行格式化 //format表示用于格式化时间的字符串 //y--------表示4位得年份 //m--------表示月份,有前导0 //d--------表示日期 //H--------表示24小时机制的小时数 //i--------表示分钟数 //s--------表示秒数 ?>
④mktime(时,分,秒,月,日,年),返回日期的 UNIX 时间戳。
<?php $time=mktime(18,59,59,6,6,2018); echo date('y-m-d H:i:s',$time);//18-06-06 18:59:59 ?>
⑤strtotime()函数将任何英文文本的日期或时间描述解析为 Unix 时间戳
<?php echo date('y-m-d H:i:s',strtotime("now")),'<br>';//18-06-11 16:10:18 echo date('y-m-d H:i:s',strtotime("10 September 2016")),'<br>';//16-09-10 00:00:00 echo date('y-m-d H:i:s',strtotime("+1 day")),'<br>';//18-06-12 16:10:18 echo date('y-m-d H:i:s',strtotime("+1 week")),'<br>';// 18-06-18 16:10:18 echo date('y-m-d H:i:s',strtotime("+1 week 2day 4 hours 2 seconds")),'<br>';// 18-06-20 20:10:20 echo date('y-m-d H:i:s',strtotime("next Thursday")),'<br>';// 18-06-14 00:00:00 echo date('y-m-d H:i:s',strtotime("last Monday")),'<br>';//18-06-04 00:00:00 ?>
⑥时区的设置
⑦扩展知识点:
十七、递归
①函数自己调用自己
②特点:完成一个需求有多个步骤,但完成每一步所实现的代码是相似的,只有函数所传递的参数不同而已
<?php //斐波那契数列:1 2 3 5 8 ... function func($pos){ if($pos==1){ return 1; }else if($pos==2){ return 2; }else{ return func($pos-1)+func($pos-2); } } echo func(6);//13 echo func(10);//89 echo func(12);//233 ?>