前言
几乎所有的高级编程语言都支持函数或类似函数的编程结构。那为什么函数这么普遍和重要呢?我们要知道在现代计算机进程执行模型中大部分是基于“栈堆”的,而编译器不需要做太多转换就能让其在栈上运行;函数又像是一个“粘稠剂”,它对代码的抽象程度适中,很好的将不同层级的抽象体“黏结”在一起。
在PHP中,函数随处可见。PHP提供了超过1000个内置函数,来帮程序开发者解决在需求开发中所可能遇到的一切问题。前面,我们学习字符串和数组时就给大家介绍了部分PHP内置的处理字符串和数组的函数,如strlen()获取字符串长度、count()获取数组元素个数、in_array()检查元素是否在数组内等等。
在本篇章中,我将给大家讲解有关PHP函数的知识。我相信大家看完后,一定能写出自己的函数。
自定义函数
在PHP中,我们除了调用PHP内置函数外,还可以根据自己需求自定义属于自己的函数。
例:
运行结果:
任何有效的PHP代码都有可能出现在函数内部,甚至包括其他函数和类。函数名和PHP中的其他标识符命名规则相同,如变量。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。
函数的调用也可以放在函数声明之前。
例:
运行结果:
思考:前面我们不是说了代码的执行是线性的吗?那为什么函数可以提前调用呢?
答:
首先PHP不是单纯的按照行来边解释边执行的,而是先由Zend引擎翻译PHP代码到Zend二进制操作码,然后再去执行操作码。对于函数的位置,因为函数的作用域是全局的,所以只要定义了,那么就可以在任意位置去调用它。PHP 中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。
但是除了两种情况,函数必须在其调用之前被定义。
1.当一个函数是有条件被定义时,必须在调用函数之前定义
例:
运行结果:
2.函数中的函数;PHP中函数是还可以包含一个或多个函数的。
例:
运行结果:
例:
运行结果:
PHP的函数与Java的函数不同,PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数。
返回值
如果大家之前也接触过别的编程语言,那对返回值也同样不会陌生。跟大多数编程语言一样,PHP的返回值也是通过关键字return来标识的。不过PHP只允许返回零或一个值,不支持多个返回值,这点又与Go不同。不过我们可以通过返回一个数组或对象的方式来实现多个返回值的操作。
例:
运行结果:
注意:大家是否有看出,我们以上三个函数与之前的函数的不同了呢?对的,上面的三个函数在函数名小括号后紧跟了一个冒号(:)和类型声明。其实,这是限定了我们定义的函数的返回类型。在PHP7+以后,就可以这么做了。但这并不是必须要这么做的,只是PHP官方给我们加了这么一个功能在这儿,当我们有需要时可以随时拿去用。
return语句后的代码将不会继续执行。
例:
运行结果:
有参函数
为了让我们的函数更灵活除了让它有返回值以外,还要能传递参数帮我们处理问题。函数的参数必须写在函数声明的小括号内,同样和我们限定函数的返回类型一样,函数的参数我们也可以限定类型。
例:
运行结果:
从 PHP 8.0.0 开始,函数参数列表可以包含一个尾部的逗号,这个逗号将被忽略。这在参数列表较长或包含较长的变量名的情况下特别有用,这样可以方便地垂直列出参数。
从 PHP 8.0.0 开始,废弃在可选参数后声明强制参数。可以通过删除默认值来解决。 此规则一个例外是 Type $param = null 形式的参数, 其中 null 默认值使类型隐性允许为空。 这种做法依然允许,但是推荐使用显性可为 null 的类型代替。
例:
我们在给函数添加参数时,可以给参数一个默认值,有默认值的函数在调用时可以不用传参。
例:
运行结果:
PHP 还允许使用数组 array 和特殊类型 null 作为默认参数;默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等。
注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。
引用传递
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &。
PHP中的引用传递的含义:不同的名字访问同一个变量内容。区别于传值调用,引用传递又叫做传址调用,传递的其实是变量内容所处的内存地址。
例:
运行结果:
什么时候可以用引用传递呢?
当我们所需要函数处理的传参变量数据量大时,就可以利用引用传递。
可变参数
在对函数传参时,有时我们可能自己也不确定到底会用到多少个参数,这时我们就可以通过PHP内置语法糖(...)来对参数列表进行一个可变参数列表的定义。PHP在解析参数时,会将我们的参数当作是一个数组来处理。
例:
运行结果:
如果我们在调用可变参数函数时传递的是一个数组,那么我们必须在数组前加(...)。这意味着当传递的参数是一个数组时,PHP会一一解析数组中的元素,放置到可变参数列表中。
例:
运行结果: