4.1 函数
在程序设计中,可以将经常使用的代码段独立出来,形成单独的子程序,这些子程序就是函数。函数只需要定义一次,之后便可以重复使用,故可以增强代码的重用性。一般而言,函数的功能较为单一,因此函数的编写和维护比较容易。
在开发过程中,经常要重复某种操作或处理,比如日期、字符串操作等,如果每个模块的操作都要重新输入一次代码,不仅增加程序员的工作量,而且对于代码后期维护及运行效果也有着较大的影响,使用PHP函数即可让这些问题迎刃而解。
PHP函数种类和变量种类的划分方法相似,PHP中有三种类型的函数:内置函数、自定义函数和变量函数。
内置函数类似于预定义变量。PHP内置函数是PHP已预定义好的函数,这些函数在编程时无须定义,可以直接使用。
自定义函数类似于自定义变量,由程序员根据特定需要编写出来的代码段。和内置函数不同,自定义函数只有在定义之后才可以使用。
变量函数类似于可变变量,变量函数的函数名为一个变量。
三种类型的函数都有一个共同特点:调用函数时,对函数名大小写不敏感,例如:调用md5()函数和调用MD5()函数实质上是调用同一个函数。
4.1.1 定义和调用函数
如果说一个Web应用系统是一个加工工厂,那么一个函数可以比作一个“加工作坊”,这个“加工作坊”接收上一个“作坊”传递过来的“原料”(即参数),并对这些“原料”进行加工处理产生“产品”,再把“产品”传递给下一个“作坊”。这个过程即为函数设置一个或多个参数,函数定义了一系列的操作对这些参数进行处理,然后将处理结果返回。对于自定义函数而言,其使用过程为:程序员定义函数的参数、函数体(一系列操作)及返回值,声明函数后对函数进行调用。
创建函数的基本语法格式为:
说明:
function:为声明自定义函数时必须使用到的关键字。
fun_name:为自定义函数的名称。
$str1,…,$strn:为函数的参数。
fun_body:为自定义函数的主体,是功能实现部分。
当函数被定义后,所要做的就是调用这个函数。调用函数的操作十分简单,只需要引用函数名并赋予正确的参数即可完成函数的调用。
【例4-1】定义函数square(),计算传入参数的平方,然后连同表达式和结果全部输出。
运行结果为:6*6=36。
4.1.2 在函数间传递参数
在调用函数时需要向函数传递参数,被传入的参数称为实参,而函数定义的参数为形参。
参数传递的方式有按值传递、按引用传递和默认参数3种。
1.按值传递方式
按值传递是指将实参的值复制到对应的形参中,在函数内部的操作针对形参进行,操作的结果不会影响到实参,即函数返回后,实参的值不会改变。
【例4-2】首先定义一个函数sum(),功能是将传入的参数值做一些运算后再输出。接着在函数外部定义一个变量$m,也就是要传进来的参数。最后调用函数sum($m),输出函数的返回值$m和变量$m的值。
运行结果如下:
2.按引用(地址)传递方式
按引用传递就是将实参的内存地址传递到形参中。这时,在函数内部的所有操作都会影响到实参的值,返回后实参的值会发生变化。引用传递方式就是传值时在原基础上加&号即可。
【例4-3】仍然使用【例4-2】中的代码,唯一不同的地方就是函数参数多了一个&号。
运行结果如下:
3.默认参数(可选参数)
还有一种设置参数的方式,默认参数即可选参数。可以指定某个参数为可选参数,将可选参数放在参数列表末尾,并且指定其默认值为空。
【例4-4】使用可选参数实现一个简单的价格计算功能,设置自定义函数values的参数$tax为可选参数,其默认值为空。第一次调用该函数,并且给参数$tax赋值0.2,输出价格;第二次调用该函数,不给参数$tax赋值,输出价格。
运行结果如下:
注:当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错。从PHP 5开始,默认值也可以通过引用传递。
4.1.3 从函数中返回值
前面介绍了如何定义和调用一个函数,并且讲解了如何在函数间传递值,这里将讲解函数的返回值。通常,函数将返回值传递给调用者的方式是使用关键字return。
return()将函数的值返回给函数的调用者,即将程序控制权返回到调用者的作用域。如果在全局作用域内使用return()关键字,那么将终止脚本的执行。
【例4-5】使用return()函数返回一个操作数。先定义函数values,函数的作用是输入物品的单价、重量,然后计算总金额,最后输出商品的价格。
运行结果为:12.5。
注:return语句只能返回一个参数,即只能返回一个值,不能一次返回多个。如果要返回多个结果,就要在函数中定义一个数组,将返回值存储在数组中返回。
4.1.4 变量函数
变量函数也称作可变函数。如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且将尝试执行它。这样就可以将不同的函数名称赋给同一个变量,赋给变量哪个函数名,在程序中使用变量名并在后面加上圆括号时,就调用哪个函数执行。类似面向对象中的多态特性。变量函数还可以被用于实现回调函数、函数表等。
【例4-6】首先定义a()、b()、c()三个函数,分别用于计算两个数的和、平方和及立方和。并将三个函数的函数名(不带圆括号)以字符串的方式赋给变量$result,然后使用变量名$result后面加上圆括号并传入两个整型参数,此时就会寻找与变量$result的值同名的函数执行。
运行结果为:6。
注:大多数函数都可以将函数名赋值给变量,形成变量函数。但变量函数不能用于语言结构,例如echo()、print()、unset()、isset()、empty()、include()、require()以及类似的语句。
4.1.5 对函数的引用
按引用传递参数可以修改实参的内容。引用不仅可用于普通变量、函数参数,也可作用于函数本身。对函数的引用,就是对函数返回结果的引用。
【例4-7】首先定义一个函数,在函数名前加“&”符。接着通过变量$str引用该函数,最后输出变量$str,实际上就是$tmp的值。
运行结果为:看到结果了。
注:和参数传递不同,这里必须在两个地方使用“&”符,用来说明返回的是一个引用。
4.1.6 取消引用
当不再需要引用时,可以取消引用。取消引用使用unset函数,它只是断开了变量名和变量内容之间的绑定,而不是销毁变量内容。
【例4-8】首先声明一个变量和变量的引用,输出引用后取消引用,再次调用引用和原变量。可以看到,取消引用后对原变量没有任何影响。
运行结果为: