函数
函数
基本知识:
函数:
概念就是完成完成某一功能的代码段。从代码结构上看就是使用{}将一段功能性的代码括起来,并使用function关键为这段代码起一个名子,就是封装。在名子后加'()',此函数的作用指示此名子,只能调用。
函数是模块化编程思想的产生。在函数的基础上再进行封装就是面向对象的编程思想。
函数的作用:
减少代码冗余,达到一次定义多次调用。
示例:
函数的组成元素
函数名、形参、实参
函数的定义:
function funName(形参列表){
//函数体
【return 值】;
}
说明:
funName就是一个函数名(标识符),命令规则,只能包含字母、数字、下划线,不能以数字开头。
命名方式,小驼峰,如果函数名,由多个单词组成,除第一个单外,以后的每个单字母大写,三个单词以上使用缩写。
函数的调用:
funName(实参列表);
函数的参数
与函数相关的参数有形参、实参
形参:
函数定义时的参数就称之为形参
作用:
用于向函数内部传递数据。
形参可以让函数更改具有通用性。
特点:
形参就是一个变量,只在函数内部有效,对函数外部不可见
实参:
函数调用时的参数称之为实参,实参可以变量,可以是字面值。
作用:
用于从函数外部向函数内部传递数据
形参与实参的区别:
实参是主动向函数内部数据,形参是被接收数据
示例:
形参的默认值
php中函数的形参可以赋值,赋的值就是形参的默认值
当函数调用时没有为形参传递数据,那么函数内部使用形参的默认值
当函数调用时有没形参传递数据,那么函数内部使用实参的数据。
形参可让函数更加具有通用性。
具有默认值的形参的使用,一般习惯上将具有默认值的形参放在形参列表最后。
php中实参的个数,不能少于不具有默认值的形参的个数。
实参的个数比形参的个数多,那么多个实参会被忽略。
形参与实参内存分析
源代码:
<?php
showInfo('hello phper');
function showInfo($mes){
echo $mes;
}
$v1 = 'php15';
showInfo($v1);
?>
执行过程:
1、编译,加载源代码,词法检查,语法检查(可执行机器代码)
2、执行函数的调用,检查看内存中有没函数存在,存在。
2.1、开启执行函数,查看是否形参,有没有?没有默认,找实参(字面值)
2.2、在栈区再开辟一个专属于当前函数的内存空间
2.3、在函数专属的空间内,开启一个空间用于$mes变量名
2.4、执行ehco $mes,在函数专属空间内使用$mes变量存储的内存地址到,数据段的全局区找到相应当,并输出到缓存区。
2.5、第一次调用结束时,位于栈区的专用于第一次调用时开辟的内存空间的数据,会全部清空。
3、执行$v1 = 'php15';
3.1、直接在栈区开辟一个空间用于存储$v1
3.2、在数据段的全局区开辟一个空间用于存储'php15';
3.3、将存储php15物理地址,传给$v1
4、执行函数第2次调用showInfo($v1)
4.1、检查函数是否有形参,有形参且,调用时也传递了实参$v1
4.2、在栈区再开辟一个专属于当前函数的内存空间
4.3、在函数专属的空间内,开启一个空间用于存储$mes变量
4.4、实参与形参传递默认是值的传递,相当于$mess = $v1,将$v1存储的地址指向的数据,存储,$mess存储的地址指向的空间。
4.5、将全局区为$mess变量开辟的存储数据的空间的地址传递给栈区中的$mess变量
4.6、执行ehco $mes,在函数专属空间内使用$mes变量存储的内存地址到,数据段的全局区找到相应当,并输出到缓存区。
4.7、第一次调用结束时,位于栈区的专用于第一次调用时开辟的内存空间的数据,会全部清空。
5、脚本执行结束栈区,与代码段清空,数据段中没有被指向的数据全部被操作系统 回收。
图解:
函数的返回值
函数用于完成一功能,在完成功能的同时在函数内部会产生数据,数据可能会在函数执行结束后,被其后的代码所使用。由于函数在执行结束后,所有的数据都被清空(函数内部无法保存数据),需要将函数产生的数据返回给函数的调用处
语法:
return 值;
说明:
return并不是必须的,是根据需求而定。
一个函数内可以有多个return,当函数在执行时,遇到任何一个return都会直接结束函数体。
示例1:
示例2:
函数体:
完成某一功能的代码段。
匿名函数
匿名函数,就是没有名子函数(JS)
可变函数
一个变量的值是另一个函数的名,那么就可以在变量名后使用'()'来调用,与变量值同名的函数。