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, 递归的本质就是以空间换取时间!

 

例如:

迭代思想   迭代就是从前往后来解决问题,体现在代码上,其实就是一个步骤的重复的执行,也就是循环结构!

 例如:

原文地址:https://www.cnblogs.com/czhd666/p/6084031.html