3.8 PHP函数
在开发过程中,经常要重复某种操作或处理,如数据查询、字符操作等,如果每个模块的操作都要重新输入一次代码,不仅令程序员头痛不已,而且对于代码的后期维护及运行效果也有着较大的影响,使用PHP函数即可让这些问题迎刃而解,下面即介绍这些知识。
3.8.1 定义和调用函数
函数,就是将一些重复使用到的功能写在一个独立的代码块中,在需要时单独调用。创建函数的基本语法格式为:
function fun_name($str1,$str2,…,$strn){ fun_body; }
其中,function为声明自定义函数时必须使用到的关键字;fun_name为自定义函数的名称;$str1,$str2,…,$strn为函数的参数;fun_body为自定义函数的主体,是功能实现部分。
当函数被定义好后,所要做的就是调用这个函数。调用函数的操作十分简单,只需要引用函数名并赋予正确的参数即可完成函数的调用。
【例3.24】在本例中定义了一个函数example(),计算传入的参数的平方,然后连同表达式和结果全部输出。实例代码如下:(实例位置:资源包\TM\sl\3\24)
<?php /*声明自定义函数*/ function example($num){ echo "$num * $num = ".$num * $num; //输出计算后的结果 } example(10); //调用函数 ?>
结果为:10 * 10 = 100
3.8.2 在函数间传递参数
在调用函数时,需要向函数传递参数,被传入的参数称为实参,而函数定义的参数为形参。参数传递的方式有按值传递、按引用传递和默认参数3种。
1.按值传递方式
将实参的值复制到对应的形参中,在函数内部的操作针对形参进行,操作的结果不会影响到实参,即函数返回后,实参的值不会改变。
【例3.25】本例首先定义一个函数example(),功能是将传入的参数值做一些运算后再输出。接着在函数外部定义一个变量$m,也就是要传进来的参数。最后调用函数example($m),输出函数的返回值$m和变量$m的值。实例代码如下:(实例位置:资源包\TM\sl\3\25)
<?php function example( $m ){ //定义一个函数 $m = $m * 5 + 10; echo "在函数内:\$m = ".$m; //输出形参的值 } $m = 1; example( $m ) ; //传递值,将$m的值传递给形参$m echo "<p>在函数外 \$m = $m <p>" ; //实参的值没有发生变化,输出m=1 ?>
运行结果如图3.14所示。
图3.14 按值传递方式
2.按引用传递方式
按引用传递就是将实参的内存地址传递到形参中。这时,在函数内部的所有操作都会影响到实参的值,返回后,实参的值会发生变化。引用传递方式就是传值时在原基础上加“&”即可。
【例3.26】仍然使用例3.25中的代码,唯一不同的地方就是多了一个“&”。实例代码如下。(实例位置:资源包\TM\sl\3\26)
<?php function example( &$m ){ //定义一个函数,同时传递参数$m的变量 $m = $m * 5 + 10; echo "在函数内:\$m = ".$m; //输出形参的值 } $m = 1; example( $m ) ; //传递值:将$m的值传递给形参$m echo "<p>在函数外:\$m = $m <p>" ; //实参的值发生变化,输出m=15 ?>
运行结果如图3.15所示。
图3.15 按引用传递方式
3.默认参数(可选参数)方式
还有一种默认参数的方式,即可选参数。可以指定某个参数为可选参数,将可选参数放在参数列表末尾,并且给它指定一个默认值。
【例3.27】本例使用可选参数实现一个简单的价格计算功能,设置自定义函数values()的参数$tax为可选参数,其默认值为空。第一次调用该函数,并且给参数$tax赋值0.25,输出价格;第二次调用该函数,不给参数$tax赋值,输出价格。实例代码如下:(实例位置:资源包\TM\sl\3\27)
<?php function values($price,$tax=0){ //定义一个函数,其中的一个参数初始值为0 $price=$price+($price*$tax); //声明一个变量$price,等于两个参数的运算结果 echo "价格:$price<br>"; //输出价格 } values(100,0.25); //为可选参数赋值0.25 values(100); //没有给可选参数赋值 ?>
结果为:价格:125
价格:100
注意
当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错。
说明
从PHP 5开始,默认值也可以通过引用传递。
3.8.3 从函数中返回值
在3.8.1节中介绍了如何定义和调用一个函数,并且讲解了如何在函数间传递值,本节将讲解函数的返回值。通常,函数将返回值传递给调用者的方式是使用关键字return。
return将函数的值返回给函数的调用者,即将程序控制权返回到调用者的作用域。如果在全局作用域内使用return关键字,那么将终止脚本的执行。
【例3.28】本例使用return关键字返回一个操作数。先定义函数values(),函数的作用是输入物品的单价、重量,然后计算总金额,最后输出商品的价格。实例代码如下:(实例位置:资源包\TM\sl\3\28)
<?php function values($price,$weight=0.45){ //定义一个函数,函数中的一个参数有默认值 $price=$price+($price*$weight); //计算物品金额 return $price; //返回金额 } echo values(100); //调用函数 ?>
结果为:145
return语句只能返回一个参数,也即只能返回一个值,不能一次返回多个值。如果要返回多个结果,就要在函数中定义一个数组,将返回值存储在数组中返回。
3.8.4 变量函数
PHP支持变量函数。下面通过一个实例来介绍变量函数的具体应用。
【例3.29】本例首先定义3个函数,接着声明一个变量,通过变量来访问不同的函数。实例代码如下:(实例位置:资源包\TM\sl\3\29)
<?php function come() { //定义come()函数 echo "来了<p>"; } function go($name = "jack") { //定义go()函数 echo $name."走了<p>"; } function back($string) //定义back()函数 { echo "又回来了,$string<p>"; } $func = "come"; //声明一个变量,将变量赋值为come $func(); //使用变量函数来调用函数come() $func = "go"; //重新给变量赋值 $func("Tom"); //使用变量函数来调用函数go() $func = "back"; //重新给变量赋值 $func("Lily"); //使用变量函数来调用函数back() ?>
运行结果如图3.16所示。
图3.16 变量函数
可以看到,函数的调用是通过改变变量名来实现的,通过在变量名后面加上一对小括号,PHP将自动寻找与变量名相同的函数,并且执行它。如果找不到对应的函数,系统将会报错。这个技术可以用于实现回调函数和函数表等。