4.2 自定义函数
其实,更多的情况下,程序员需要的是自定义函数。
4.2.1 自定义和调用函数
自定义函数的语法结构如下:
function name_of_function( param1, param2, … ){ statement }
其中,name_of_function是函数名,param1、param2是参数,statement是函数的具体内容。
下面以自定义和调用函数为例进行讲解。本实例主要实现酒店欢迎信息。
【例4.2】(实例文件:ch04\4.2.php)
<? php function sayhello($customer){ //自定义函数sayhello return $customer.", 欢迎您来到GoodHome酒店。"; } echo sayhello(’张先生’); //调用函数sayhello ?>
本程序运行结果如图4-2所示。
图4-2 程序运行结果
值得一提的是,此函数的返回值是通过值返回的。也就是说return语句返回值时,创建了一个值的副本,并把它返回给使用此函数的命令或函数,在这里是echo命令。
4.2.2 向函数传递参数值
由于函数是一段封闭的程序,因此很多时候程序员都需要向函数内传递一些数据来进行操作。
function函数名称(参数1,参数2){ 算法描述,其中使用参数1和参数2; }
下面以计算酒店房间住宿费总价为例进行讲解。
【例4.3】(实例文件:ch04\4.3.php)
<? php function totalneedtopay($days, $roomprice){ // 声明自定义函数 $totalcost = $days*$roomprice; // 计算住宿费总价 echo "需要支付的总价:$totalcost"."元。"; // 计算住宿费总价 } $rentdays = 3; //声明全局变量 $roomprice = 168; totalneedtopay($rentdays, $roomprice); //通过变量传递参数 totalneedtopay(5,198); //直接传递参数值 ?>
运行结果如图4-2所示。
图4-3 程序运行结果
【案例分析】
(1)以这种方式传递参数值的方法就是向函数传递参数值。
(2)其中function totalneedtopay($days, $roomprice){}定义了函数和参数。
(3)不管是通过变量$rentdays和$roomprice向函数内传递参数值,还是像totalneedtopay (5,198)这样直接传递参数值都是一样的。
4.2.3 向函数传递参数引用
向函数传递参数引用,其实就是向函数传递变量引用。参数引用一定是变量引用,静态数值是没有引用一说的。由于在变量引用中已经知道,变量引用其实就是对变量名的使用,是对特定的变量位置的使用。
下面仍然以计算酒店服务费总价为例进行讲解。
【例4.4】(实例文件:ch04\4.4.php)
<? php $fee = 300; $serviceprice = 50; function totalfee(&$fee, $serviceprice){ // 声明自定义函数,参数前多了&,表示按引用传递 $fee = $fee+$serviceprice; // 改变形参的值,实参的值也会发生改变 echo "需要支付的总价:$fee"."元。"; } totalfee($fee, $serviceprice); //函数外部调用fun()函数前$fee =300 totalfee($fee, $serviceprice); //函数外部调用fun()函数后$ fee =350 ?>
运行结果如图4-4所示。
图4-4 程序运行结果
【案例分析】
(1)以这种方式传递参数值的方法就是向函数传递参数引用。使用“&”符号表示参数引用。
(2)其中function totalfee(&$fee, $serviceprice){}定义了函数、参数和参数引用。变量$fee是以参数引用的方式进入函数的。当函数的运行结果改变了变量$fee的引用时,在函数外的变量$fee的值也发生了改变,也就是函数改变了外部变量的值。
4.2.4 从函数中返回值
在上述例子中,都是把函数运算完成的值直接打印出来。但是,很多情况下,程序并不需要直接把结果打印出来,而是仅仅给出结果,并且把结果传递给调用这个函数的程序,为其所用。
这里需要用到return关键字。下面以综合酒店客房价格和服务价格为例进行讲解。
【例4.5】(实例文件:ch04\4.5.php)
<? php function totalneedtopay($days, $roomprice){ // 声明自定义函数 return $days*$roomprice; // 返回酒店消费总价格 } $rentdays = 3; $roomprice = 168; echo totalneedtopay($rentdays, $roomprice); ?>
运行结果如图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)
<? php function &example($aa=1){ //定义一个函数,别忘了加“&”符号 return $aa; //返回参数$aa } $bb= &example("引用函数的实例"); //声明一个函数的引用$bb echo $bb. "<br />"; ?>
运行结果如图4-6所示。
图4-6 程序运行结果
【案例分析】
(1)本实例首先定义一个函数,然后变量$bb将引用函数,最后输出变量$bb,它实际上是$aa的值。
(2)和参数传递不同,在定义函数和引用函数时,都必须使用“&”符号,表明返回的是一个引用。
4.2.6 对函数取消引用
对于不需要引用的函数,可以做取消操作。取消引用使用unset()函数来完成,目的是断开变量名和变量内容之间的绑定,此时并没有销毁变量内容。
【例4.7】(实例文件:ch04\4.7.php)
<? php $num = 166; //声明一个整型变量 $math = &$num; //声明一个对变量$num的引用$math echo "\$math is: ".$math."<br />"; //输出引用$math unset($math); //取消引用$math echo "\$num is: ".$num; //输出原变量 ?>
运行结果如图4-7所示。
图4-7 程序运行结果
本程序首先声明一个变量和变量的引用,输出引用后取消引用,再次调用原变量。从图4-6可以看出,取消引用后对原变量没有任何影响。