4.2 自定义函数
在大多数情况下,程序员需要的是自定义函数。
4.2.1 自定义函数和调用函数
自定义函数的语法结构如下:
其中,name_of_function是函数名,param1和param2等是参数,statement是函数中的具体程序语句。
下面以自定义函数和调用函数为例进行讲解。本实例主要实现酒店欢迎信息。
【例4.2】(实例文件:源文件\ch04\4.2.php)
本程序的运行结果如图4-2所示。
图4-2 程序的运行结果
值得一提的是,此函数返回时带有返回值。也就是说,return语句返回时创建了一个值的副本,并把它返回给调用此函数的程序语句,在这个实例中是echo语句。
4.2.2 向函数传递参数值
由于函数是一段封闭的程序代码,因此很多时候程序员都需要向函数内传递一些数据来进行操作。
下面以计算酒店房间住宿费总价为例进行讲解。
【例4.3】(实例文件:源文件\ch04\4.3.php)
本程序的运行结果如图4-3所示。
图4-3 程序的运行结果
【案例分析】
(1)以这种方式传递参数值的方法就是向函数传递参数值。
(2)其中function totalneedtopay($days,$roomprice){}定义了函数和参数。
(3)无论是通过变量$rentdays和$roomprice向函数内传递参数值,还是像totalneedtopay (5,198)这样直接传递参数值都是一样的。
4.2.3 向函数传递参数引用
向函数传递参数引用其实就是向函数传递变量引用。参数引用一定是变量引用,静态数值是没有引用一说的。变量引用其实就是对特定变量位置的使用。
下面仍然以计算酒店服务费总价为例进行讲解。
【例4.4】(实例文件:源文件\ch04\4.4.php)
本程序的运行结果如图4-4所示。
图4-4 程序的运行结果
【案例分析】
(1)以这种方式传递参数值的方法就是向函数传递参数引用。使用“&”符号表示参数引用。
(2)其中function totalfee(&$fee,$serviceprice){}定义了函数、参数和参数引用。变量$fee是以参数引用的方式进入函数的。当函数的运行结果改变了变量$fee的引用时,在函数外的变量$fee的值也发生了改变,也就是函数改变了外部变量的值。
4.2.4 从函数中返回值
在上述例子中,都是把函数运算完成的值直接打印出来。但是,在很多情况下,程序并不需要直接把结果打印出来,而是仅仅给出结果,并且把结果传递给调用这个函数的程序,为其所用。
这里需要用到return关键字。下面以综合酒店客房价格和服务价格为例进行讲解。
【例4.5】(实例文件:源文件\ch04\4.5.php)
本程序的运行结果如图4-5所示。
图4-5 程序的运行结果
【案例分析】
(1)在函数function totalneedtopay($days,$roomprice)算法中,直接使用return把运算的值返回给调用此函数的程序。
(2)其中,echo totalneedtopay($rentdays,$roomprice);语句调用了此函数,totalneedtopay()把运算值返回给了echo语句,才有了上面的显示。当然这里也可以不用echo来处理返回值,也可以对它进行其他处理,比如赋值给变量等。
4.2.5 对函数的引用
无论是PHP中的内置函数,还是程序员在程序中自定义的函数,都可以简单地通过函数名调用。但是操作过程也有些不同,大致分为以下3种情况。
· 如果是PHP的内置函数,如date(),可以直接调用。
· 如果这个函数是PHP的某个库文件中的函数,就需要调用include()或require()函数把此库文件载入,然后才能调用这个函数。
· 如果是自定义函数,与引用程序在同一个文件中,就可以直接引用。如果此函数不在当前文件内,就需要先调用include()或require()函数载入。
对函数的引用实际上是对函数返回值的引用。
【例4.6】(实例文件:源文件\ch04\4.6.php)
本程序的运行结果如图4-6所示。
图4-6 程序的运行结果
【案例分析】
(1)本实例首先定义一个函数,然后用变量$bb引用函数,最后输出变量$bb,实际上就是$aa的值。
(2)和参数传递不同,在定义函数和引用函数时,都必须使用“&”符号,表明返回的是一个引用。
4.2.6 对函数取消引用
对于不需要引用的函数,可以执行取消操作,通过调用unset()函数来完成,目的是断开变量名和变量内容之间的绑定,此时并没有销毁变量内容。
【例4.7】(实例文件:源文件\ch04\4.7.php)
本程序的运行结果如图4-7所示。
图4-7 程序的运行结果
本程序首先声明一个变量和变量的引用,输出引用后取消引用,再次调用原变量。从图4-7可以看出,取消引用后对原变量没有任何影响。