PHP从入门到精通(第5版)
上QQ阅读APP看书,第一时间看更新

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将自动寻找与变量名相同的函数,并且执行它。如果找不到对应的函数,系统将会报错。这个技术可以用于实现回调函数和函数表等。