首页 > 代码库 > PHP函数
PHP函数
函数概念 函数就是一组代码的集合,主要目的是实现代码的重用 。函数可以分成系统函数和用户自定义函数!
语法: function 函数名(形参){
函数体
}
函数名(实参) // (函数的调用)
注意:
1, 即使没有实参列表,也不能省掉小括号!
2,函数必须先声明才能调用,但是在书写代码的时候可以先调用然后再写函数的定义的代码,因为脚本的在执行之前会进行一次预编译,预编译后函数的定义代码已经放置在内存中的用户代码区,而执行的时候,直接在用户代码区里找
函数命名规范
1, 函数名遵守基本的标识符的命名规则,但函数名不区分大小写,一般用小驼峰法来表示!(注明:习惯上以后的类名用大驼峰法,因为类名也不区分大小写)
2, 函数不能重复定义,所以在定义用户自己的函数的时候,注意函数名不能与系统函数名相冲突!
可变函数 所谓的可变函数,就是指函数名也可以用一个变量来代替!
匿名函数 PHP也允许定义没有名字的函数,叫作匿名函数! 所谓的匿名函数,就是在定义的时候省略掉函数名即可
作用:更加灵活,对系统资源消耗比较少!
函数的参数 形参和实参
形式参数parameter
形参,是在定义函数的时候规定的,但是这里的参数只是一个形式,默认是没有值的,只是说明此处需要使用一个数据来代替,当然,定义函数的时候也可以没有形参!
形参必须是一个变量
形参的默认值 常见的,形参的值应该来源于实参传递的值,但是,如果某些形参的值有比较常用的情况,此时,我们可以在定义形参的时候给该参数一个默认值!
注意:
1,如果一个函数存在多个形参,那么其中有默认值的形参应该放在整个形参列表的后面
2,参数的默认值,应该是一个确定的直接值,不能是一个变量或其他函数返回值!也不能是参与运算的值!
实际参数argument
实参,是在调用函数的时候需要把实际的值(实参)传递给该函数的形参,这个时候,函数的形参才有真正的数据!实参也可以是一个变量
参数的值传递 默认的就是值传递,此时实参传递给形参之后,两者就没有关系了
参数的引用传递 需要在传递的时候加上求地址运算符& 。& 应该放在形参的前面
一般来说,我们认为函数只能有一个返回值(允许在代码内出现多个return语句,但是只能执行一条,因为一旦遇到return语句就马上结束函数的执行)!
但是,我们可以利用引用传递,实现可以类似的返回多个值的效果
参数的数量问题 一般来说,实参和形参的数量应该一样,也就是一一对应!
实参多于形参 可以正常的运行,所有形参按实参的顺序依次接收,多于的实参直接舍弃
实参少于形参 只有一种正常的情况,就是形参列表的后面有默认值的时候,可以省掉形参变量的实参值!除此之外,要报一个warning级别的错误
不确定参数 比如系统函数max
func_get_arg() : 获得某个参数的值,使用参数的索引位置来表示。从0开始,比如 func_get_arg(1)
func_num_args() :获得实参的数量!
函数体中的return语句 函数体就是可执行的代码的集合,以完成相应的功能!其中一个return语句比较重要!
return语句的作用有两个:1, 将函数的返回值,返回给调用该函数的位置!2, 终止函数的运行!
注意: 一个函数可以有多个return语句,但是只会执行其中的一条!如果一个函数确实有很多个值需要返回,可以用引用传递模拟(其实不叫返回值),最常用的是将这些值放到一个数组里面,然后返回这个数组就行了
变量的作用域 变量的作用域,就是指一个变量在哪能用在哪不能用,也就是一个变量其作用的有效范围!
在PHP中,用户定义的变量支持两种作用域:局部作用域和全局作用域
局部作用域:在一个函数内部定义的变量,其作用范围就是局部作用域,该变量也叫作局部变量!
全局作用域:在函数外部定义的变量,其作用范围就是全局作用域,该变量也叫作全局变量,但是PHP中的全局作用域与JS中的全局作用域是不一样的:
所以:
1, PHP中的全局和局部作用域是完全不重叠的,也就是相互之间不能访问!
2, 每个函数也都有自己的局部作用域,函数直接的变量也无法互相访问!
超全局变量 也是作用域的概念,但却是用户不能直接定义的作用域!也就是说,用户无法定义一个超全局变量!
所谓的超全局变量,有点类似于JS中的全局变量,也就是在全局和局部(函数外和函数内)都可以使用的变量!
既然用户无法定义超全局变量,说明超全局变量都是系统预定义的!也就是我们前面学习的那些超全局预定义数组变量!
预定义变量$GLOBALS 预定义变量$GLOBALS就是专业将用户的数据超全局化的!
其“专业精神”体现在如下的方面:
1,$GLOBALS数组的每一个元素,都与当前的每一个全局变量是一一对应的,也就是说,每当用户创建一个全局变量,都会自动的在$GLOBALS数组里面增加一个元素,其中元素的键就是全局变量的名字,元素的值就是全局变量的值!
2,反之,每当增加一个$GLOBALS数组的一个元素,就会自动的创建一个全局变量!
3,此时全局变量与$GLOBALS的关系并不是引用传递的关系,甚至比引用传递更“亲密”,因为它们所有的操作都是同步的,无论其中的一个做了任何的修改,都会以直接的相同的方式影响到另一个!
变量的生命周期 所谓的变量的生命周期,就是指变量在上面时候出现(“出生”),又在什么时候消失(“死亡”)!
全局变量的生命周期:
1, 执行到变量的初始化语句的时候出现
2, PHP所有的资源(包括全局变量),都会在一个脚本周期结束的时候全部消失!
3,全局变量被unset之后也会消失
局部变量的生命周期:
1, 在调用到该函数并执行到该局部变量的初始化语句的时候出现
2, 在函数内如果unset掉该局部变量也会消失
3, 当函数执行完毕后就消失
静态局部变量 所谓的静态局部变量,是指该变量不会随着函数执行的结束而消失,而是,只要这个函数还在(在内存),该变量就一直存在!
最大特点:每次调用该函数后,其中的静态局部变量都会被保存下来而不会消失(下次调用该函数的时候可以接着使用)
定义静态局部变量的关键字: static,也就是在定义局部变量的时候前面加上static关键字就行了
注意: 无论有没有static关键字,在函数内部定义的变量都是局部变量,函数外一样不能使用!所以,要注意区分静变量的生命周期与变量作用域之间的区别
函数的递归调用
递归的含义 递归其实不是一种新的语法,而是一种算法的描述!
语法上,所谓的函数的递归调用,就是函数在执行的时候自己调用自己
函数的递归有两个要素:
1, 递归出口:就是什么时候停止自己调用自己
2, 递归点:就是什么时候开始自己调用自己
先写递归出口再写递归点
递归调用的特点:
1, 代码的书写比较简单,但是执行的时候比较消耗内存资源!(使用迭代思想 )
2, 递归的本质就是以空间换取时间!
例如:
迭代思想 迭代就是从前往后来解决问题,体现在代码上,其实就是一个步骤的重复的执行,也就是循环结构!
例如:
PHP函数