官术网_书友最值得收藏!

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-3所示。

圖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()命令加載。

●如果是自定義函數,如果與引用程序同在一個文件中,則可直接引用。如果此函數不在當前文件內,則需要用include()或require()命令加載。

對函數的引用,實際上是對函數返回值的引用。

【例4.6】(實例文件:ch04\4.6.php)

    <? php
    function &example($aa=1){                  //定義一個函數,別忘了加“&”符號
    return $aa;                               //返回參數$str
    }
    $bb= &example("引用函數的實例");             //聲明一個函數的引用$str1;
    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可以看出,取消引用后對原變量沒有任何影響。

主站蜘蛛池模板: 柳江县| 宁夏| 谢通门县| 屏山县| 新乡县| 文水县| 台中市| 乌什县| 宣化县| 天镇县| 峨山| 都江堰市| 札达县| 湟中县| 贺州市| 竹山县| 大连市| 芦溪县| 成都市| 福州市| 东乡县| 叶城县| 封丘县| 中牟县| 静宁县| 东乌珠穆沁旗| 襄汾县| 通海县| 祁门县| 民丰县| 勃利县| 佛坪县| 兴城市| 上林县| 曲靖市| 新竹市| 东乡| 南城县| 浦城县| 佳木斯市| 马山县|