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

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可以看出,取消引用后对原变量没有任何影响。