PHP5與MySQL5入門學習指南PHP5與MySQL5入門學習指南第14章自定函數凱文瑞克著PHP5與MySQL5入門學習指南本章大綱14-1建立函數14-2參數的傳遞14-3預設參數值14-4可變長度參數問題與討論PHP5與MySQL5入門學習指南14-1建立函數自定函數的格式如下Function自定函數名稱($arg1,$arg2,...$argn){函數敘述;return函數返回值;}自定函數以Function開始,表示後面要定義一個函數。緊接著就是函數的名稱。$arg表示傳入函數的參數,參數依序排列以,做分隔。函數敘述就是設計者希望處理資料的內容,可以是單行或多行指令。最後return是表示以函數的名稱回傳一個值給主程式,當然主程式也必須要有一個變數來接受函數的回傳值。如果要傳回多個值則必須利用list函數來接收函數傳回的值。PHP5與MySQL5入門學習指南1:?php2:FunctionPay($price,$amount){3:echo價格:$pricebr數量:$amountbr\n;4:echo金額:.$price*$amount.p;5:}6:?7:html8:title自定函數/title9:body10:?php11:$Price=90;12:$Amount=100;13:Pay($Price,$Amount);//第一次呼叫函數14:$Price=60;15:$Amount=50;16:Pay($Price,$Amount);//第二次呼叫函數17:?18:/body19:/html第2-5行定義一個Pay函數,第3行顯示商品價格和數量,第4行顯示商品金額.在這個範例中函數並沒有回傳值.第11-12價格($Price)和數量($Amount).第13行呼叫Pay函數同時將價格及數量傳入函數.經函數處理後如圖14-1顯示前三行的結果.第14-15行重新定義價格和數量.第16行第2次呼叫Pay函數.當然傳入Pay函數的是第14-15行新設定的價格及數量.經函數處理後如圖顯示後三行的結果.PHP5與MySQL5入門學習指南1:?php2:FunctionPay($price,$amount){3:echo價格:$pricebr數量:$amountbr\n;4:$S=$price*$amount;5:return$S;6:}7:?8:html9:title自定函數/title10:body11:?php12:$Price=90;13:$Amount=100;14:$total1=Pay($Price,$Amount);//第一次呼叫函數15:echo金額:$total1p;16:$Price=60;17:$Amount=50;18:$total2=Pay($Price,$Amount);//第二次呼叫函數19:echo金額:$total2p;20:$total2+=$total1;21:echo總金額:$total2;23:?24:/body25:/html函數Pay()會計算總價並利用變數回傳給$total,最後將二項商品金額顯示在網頁上。PHP5與MySQL5入門學習指南1:?php2:functionmessage(){3:echo函數回傳三個數值.p;4:returnarray(Hello,My,friend);5:}6:?7:html8:title多個回傳值/title9:body10:?php11:list($msg1,$msg2,$msg3)=message();12:echo主程式接收多個訊息如下br;13:echo$msg1$msg2$msg3;14:?15:/body16:/html第2-5行定義函數message().第4行利用array()傳回3個文字串.有3個文字串自函數傳回來,所以第11行利用list()接收回傳值,第1個回傳值對應第1個變數$msg1,依此類推.第13行顯示接收的三個變數.PHP5與MySQL5入門學習指南14-2參數的傳遞自定函數的參數傳遞可以分成二種方式–傳址呼叫–傳值呼叫PHP5與MySQL5入門學習指南14-2-1傳值呼叫(CallByValue)傳值呼叫的方式是由主程式傳遞變數的值給自訂函數的參數。PHP5與MySQL5入門學習指南1:?php2:FunctionPay($Price,$Amount,$Total){3:echo===========inFunctionPay========br;4:echoPrice:$PricebrAmount:$Amountbr\n;5:$Total=$Price*$Amount;6:echoTotalinFunctionPay:$Totalp\n;7:}8:?9:html10:title傳值呼叫/title11:body12:?php13:$Price=90;14:$Amount=100;15:$Total=0;16:Pay($Price,$Amount,$Total);17:echo==============inMain===========br;18:echoPrice:$PricebrAmount:$Amountbr\n;19:echoTotalinmain:$Totalbr;20:?21:/body22:/html範例是使用傳值呼叫,所以一開始第15行$Total起始值為0,然後第16行傳入Pay時會複製一個0的值給Pay中的$Total。此時主程式$Total與FunctionPay()的$Total是分別二個不同變數。經函數計算之後第5行$Total值就變成9000而主程式$Total值是0不會改變,因為這二者之間並沒有關係。所以在圖14-2中可以看到在FunctionPay()的$Total=9000,而在main中$Total為0。PHP5與MySQL5入門學習指南14-2-2傳址呼叫(CallByReference)傳址呼叫是傳入變數的位址而不是值,所以函數參數是接受主程式傳來的一個位址。因此參數會指向原變數由於PHP5的預設值不予許使用callbyreference因此需要將PHP.INI中的allow_call_time_pass_reference設定為on才可以使用.PHP5與MySQL5入門學習指南1:?php2:FunctionPay($Price,$Amount,&$Total){3:echo===========inFunctionPay==========br;4:echoPrice:$PricebrAmount:$Amountbr\n;5:$Total=$Price*$Amount;6:echoTotalinFunctionPay:$Totalp\n;7:}8:?9:html10:title傳址呼叫/title11:body12:?php13:$Price=90;14:$Amount=100;15:$Total=0;16:Pay($Price,$Amount,$Total);17:echo==============inMain==============br;18:echoPrice:$PricebrAmount:$Amountbr\n;19:echoTotalinmain:$Totalbr;20:?21:/body22:/html第2行參數$Total前面加上&表示變數是傳址呼叫第一種傳址呼叫,'&'是寫在Function中的參數列,所以一定會使用傳址呼叫。PHP5與MySQL5入門學習指南1:?php2:FunctionPay($price,$amount,$total){3:echoPrice:$priceAmount:$amountbr\n;4:$total=$price*$amount;5:echoTotalinFunctionPay:$totalbr\n;6:echop\n;7:}8:?9:html10:title選擇傳遞方式/title11:body12:?php13:$Price=90;14:$Amount=100;15:$Total=0;16:Pay($Price,$Amount,$Total);17:echoTotalinmain:$Total==傳值呼叫hrp\n;18:Pay($Price,$Amount,&$Total);19:echoTotalinmain:$Total==傳址呼叫hr;20:?21:/body22:/htmlPay函數一共被呼叫二次,第16行第一次呼叫Pay函數是屬於傳值呼叫的方式。第18行第二次呼叫是傳址呼叫,在呼叫函數時傳入參數的寫法是&$Total屬於傳址呼叫。第二種傳址呼叫,由呼叫函數時才決定如何傳遞參數,可依程式不同之需求而選擇傳值或傳址呼叫。PHP5與MySQL5入門學習指南14-3預設參數值在自訂函數撰寫時可以事先給予參數一個預設值,當主程式呼叫函數時有二種選擇。–第一種如果主程式有傳值給函數,則函數中參數值即以主程式傳入的值代入。–第二種如果主程式沒有傳值給函數,則以函數將以函數定義的預設值帶入參數。其格式如下functionfunc_name(arg1,arg2=n){函數內容}說明:func_name為函數名稱,arg1是第一個參數,第二個參數是arg2,其預設值為n.PHP5與MySQL5入門學習指南1:?php2:functionPay($price,$amount,$discount=0.8){3:echo價格:$price元br;4:echo數量:$amount個br;5:$showcnt=$discount*10;6:echo折扣:$showcnt折br;7:return$price*$amount*$discount;8:}9:?10:html11:title預設參數/title12:body13:?php14:$Price=100;15:$Amount=8;16:echo特別折扣:br;17:$Discount=0.5;18:$cost=Pay($Price,$Amount,$Discount);//傳入$Discount參數19:echo總價:$cost元p\n;20:echo一般折扣:br;21:$cost=Pay($Price,$Amount);//未傳入$Discount,以預設值帶入22:echo總價:$cost元;23:?24:/body25:/html$discount被設定了預設值為0.8。當參數設定預設值之後,一旦函數呼叫時未傳入參數值,參數值就會被預設值所取代。PHP5與MySQL5入門學習指南第一點,預設值必須是一個常數,不可以是變數。第二點,預設值的參數必須是在參數列的右邊開始,由右向左延伸。這一點很容易理解,如果有一函數如下Functiontest($A=10,$B)在函數呼叫時僅傳入一個數值test(20);這個時候20是應該傳給$A還是$B?由此可知上面的寫法有問題。如果函數改寫如下:Functiontest($B,$A=10)則函數呼叫test(20);//$B=20,$A=10(預設值)test(20,15);//$B=20,$A=15這樣無論是傳入一個參數或二個參數都不會混淆。所以凡是參數有預設值則必須寫在參數列的最右邊開始依序向左延伸。使用預設值的注意事項PHP5與MySQL5入門學習指南14-4可變長度參數一種參數傳輸技巧.配合可變長度參數擷取參數時所使用的函數.–func_num_args()會傳回傳入參數的個數.–func_get_ars(n)會傳回第n個參數,