函数(基本了解)
函数的基本概念
函数定义语法
function 函数名(【参数】){
//函数体
//返回值:return 结果;
}
函数的使用: 函数名+();有参数的需要传实参;
函数实在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。
函数的调用特点:只要系统在内存中能够找到对应的函数,就可以执行(函数的调用可以早函数定义之前)
举个栗子:
<?php
//调用函数
display();
//定义函数
function display(){
//函数体
echo 'hello word'; //没有返回值
}
运行结果:
函数的内存分析:
1、读取代码进入到代码段(编译:将代码编程字节码存储到内存)
2、根据代码逐行执行
以上原因:编译和执行是分开的(先编译后运行)
函数命名规范
1、驼峰法
2、下划线法
函数参数
1.在PHP中允许实参多于形参(个数):函数内部不用而已
2.在PHP中理论上形参个数没有限制(实际开发不会太多)
3.实参不能少于形参个数
默认值
举个栗子:
$num1=10;
//函数默认值
function jian($num1 = 0,$num2 = 0){
echo $num1-$num2;
}
//调用:默认值如果存在,可以不用传入
jian($num1);
echo $num1;
运行结果:1010
注意事项:
1.默认值的定义是放在最后边的(多个),不能左边形参有默认值,但是右边没有
引用传递:
基本定义语法:
function 函数名(形参1,&形参2){
//函数体
}
在调用的时候,必须给引用传值的参数位置传入实际参数,而且参数本省必须是变量。(变量才有指向数据的内存地址)
举个栗子:
//引用传值
function display($a,&$b){
$a=*$a;
$b=*$b;
echo $a,'<br>',$b,'<br/>';
}
//定义变量
$a = 10;
$b = 5;
//调用函数
display($a,$b)
echo '<hr/>',$a,'<br/>',$b;
运行结果:
函数体
函数返回值
在没有return返回语句时,默认返回null
注意:return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转文件给包含当前文件的位置。(通常在系统配置文件中使用较多),在文件中也代表终止文件后面的代码:return之后的内容不会执行
作用域
1.全局变量:不能在函数中访问
2.局部变量:在函数自己的作用域使用,不能使用全局变量
3.超全局变量:系统自定义的变量
举个栗子:
<?php
//被添加到超全局空间中
$global='123';
//引用传值
function display($a,&$b){
$a*=$a;
$b*=$b;
echo $a,'<br>',$b,'<br/>',$GLOBALS['global'],'<br/>';
}
//定义变量
$a = 10;
$b = 5;
//调用函数
display($a,$b);
echo '<hr/>',$a,'<br/>',$b;
运行结果:
如果想函数内部使用外部变量:除了$GLOBALS之外,通过参数传值(如果要统一战线还可以使用引用传值)。
在PHP中,还有一种方式,能够实现全局访问局部,同时局部也可以访问全局:grobal关键字
grobal关键字:是一种函数里面定义变量的一种方式
1、如果使用global定义的变量名在外部存在(全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所指向的空间(同一个变量);
2、如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(外部)定义一个与全局变量同名的全局变量;
本质的形式:在函数的内部和外部,对一个同名变量(全部和局部)使用同一块内存地址保存数据,从而实现共同拥有
基本语法:
global 变量名; //不能赋值
变量名=值 //修改
静态变量
static
可变函数
当前有一个变量所保存的值刚好是一个函数的名字,那么就可以使用变量+()来充当函数名使用
可变函数在系统使用的过程中还是比较多的,尤其是使用很多系统函数的时候:需要用户在外部定义一个自定义函数,但是是需要传入到系统函数内部使用
匿名函数
没有名字的函数
基本语法:
变量名 = function(){
函数体
};
变量保存匿名函数,本质得到的是一个对象(Closure)
闭包(closure)
简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)