![PHP 7+MySQL 8动态网站开发从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/141/36862141/b_36862141.jpg)
4.2 自定义函数
在大多数情况下,程序员需要的是自定义函数。
4.2.1 自定义函数和调用函数
自定义函数的语法结构如下:
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P72_56790.jpg?sign=1739288119-LnBw0NJXGvZRSzTmG8vKSrJCmVSrNzSX-0-294926a0682f62e9b8ff8b5a223db749)
其中,name_of_function是函数名,param1和param2等是参数,statement是函数中的具体程序语句。
下面以自定义函数和调用函数为例进行讲解。本实例主要实现酒店欢迎信息。
【例4.2】(实例文件:源文件\ch04\4.2.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P72_56791.jpg?sign=1739288119-rBrzijGk5dMaZs1g9Pa44vfOaOAhYC0N-0-463e8742ed2a0fbf03db154bdbbf0aee)
本程序的运行结果如图4-2所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P72_8492.jpg?sign=1739288119-oEBWXCCTPR7QwutUVQw8CD5ul4Bt0g83-0-200b900bd5e0135ac690ab0e1c9de3aa)
图4-2 程序的运行结果
值得一提的是,此函数返回时带有返回值。也就是说,return语句返回时创建了一个值的副本,并把它返回给调用此函数的程序语句,在这个实例中是echo语句。
4.2.2 向函数传递参数值
由于函数是一段封闭的程序代码,因此很多时候程序员都需要向函数内传递一些数据来进行操作。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P73_56792.jpg?sign=1739288119-Y03iedaFuJiZMS9h5QniwqfouEMIA49S-0-58a2d6057ce7d0b1739d86134e30d5cb)
下面以计算酒店房间住宿费总价为例进行讲解。
【例4.3】(实例文件:源文件\ch04\4.3.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P73_56793.jpg?sign=1739288119-pT2aac2Ek20RALhlWgWZILd5udBRTqyL-0-c152fdbe6bb6e3b2eb051594531568f0)
本程序的运行结果如图4-3所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P73_8630.jpg?sign=1739288119-jCbJsnc8L3YWb1O9vYA85K3cqeKNr9m7-0-a291ae8257547e378d8e990aaa88d98d)
图4-3 程序的运行结果
【案例分析】
(1)以这种方式传递参数值的方法就是向函数传递参数值。
(2)其中function totalneedtopay($days,$roomprice){}定义了函数和参数。
(3)无论是通过变量$rentdays和$roomprice向函数内传递参数值,还是像totalneedtopay (5,198)这样直接传递参数值都是一样的。
4.2.3 向函数传递参数引用
向函数传递参数引用其实就是向函数传递变量引用。参数引用一定是变量引用,静态数值是没有引用一说的。变量引用其实就是对特定变量位置的使用。
下面仍然以计算酒店服务费总价为例进行讲解。
【例4.4】(实例文件:源文件\ch04\4.4.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P73_56795.jpg?sign=1739288119-q4uC1Ogx3eHeZh3MEyMW7Y0GEkks0OpT-0-6ace174896cd40331d7669275d94ba9a)
本程序的运行结果如图4-4所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P74_8720.jpg?sign=1739288119-xfZFUfQF3IsEekwTyEJxf9VIcK8DZBx2-0-42823cfcc460fd1be78890c5b8de8a93)
图4-4 程序的运行结果
【案例分析】
(1)以这种方式传递参数值的方法就是向函数传递参数引用。使用“&”符号表示参数引用。
(2)其中function totalfee(&$fee,$serviceprice){}定义了函数、参数和参数引用。变量$fee是以参数引用的方式进入函数的。当函数的运行结果改变了变量$fee的引用时,在函数外的变量$fee的值也发生了改变,也就是函数改变了外部变量的值。
4.2.4 从函数中返回值
在上述例子中,都是把函数运算完成的值直接打印出来。但是,在很多情况下,程序并不需要直接把结果打印出来,而是仅仅给出结果,并且把结果传递给调用这个函数的程序,为其所用。
这里需要用到return关键字。下面以综合酒店客房价格和服务价格为例进行讲解。
【例4.5】(实例文件:源文件\ch04\4.5.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P74_56798.jpg?sign=1739288119-5EHbVdI0sq7l7LaHTcFXSdmQqgf0aOVQ-0-609188ccd1ae985e424967800e40ff5e)
本程序的运行结果如图4-5所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P74_8721.jpg?sign=1739288119-gNUWnD1gCOXxKdSrTEtcqHW3f0HFe1PW-0-1cfb17ceb835ebbe39eba2b02c89723e)
图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)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P75_56801.jpg?sign=1739288119-YkooCX1lL3T2dzV2MIiCX675q8GFk5hM-0-0d4cec12ffb90b5af4eee63fcdee72ff)
本程序的运行结果如图4-6所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P75_8780.jpg?sign=1739288119-F0X07AAELCfhfw2ZSBbzpQI6vs9D6hM3-0-0682e4c8f8b673d831f742cae39e71d9)
图4-6 程序的运行结果
【案例分析】
(1)本实例首先定义一个函数,然后用变量$bb引用函数,最后输出变量$bb,实际上就是$aa的值。
(2)和参数传递不同,在定义函数和引用函数时,都必须使用“&”符号,表明返回的是一个引用。
4.2.6 对函数取消引用
对于不需要引用的函数,可以执行取消操作,通过调用unset()函数来完成,目的是断开变量名和变量内容之间的绑定,此时并没有销毁变量内容。
【例4.7】(实例文件:源文件\ch04\4.7.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P76_56803.jpg?sign=1739288119-0v4S7seBwgNjgn5PACc0t5GgH67BVwfH-0-ec69526b915f12b0f3590f8e8ac50041)
本程序的运行结果如图4-7所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P76_8896.jpg?sign=1739288119-yG0gu7lijO4ITdNEkV7mnXjjyTtANQzA-0-9461a4cc6894f9e48d9a2d8e105a186c)
图4-7 程序的运行结果
本程序首先声明一个变量和变量的引用,输出引用后取消引用,再次调用原变量。从图4-7可以看出,取消引用后对原变量没有任何影响。