资源描述:
《PHP与MySQL入门学习指南》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
PHP5與MySQL5入門學習指南第14章自定函數凱文瑞克著 本章大綱14-1建立函數14-2參數的傳遞14-3預設參數值14-4可變長度參數問題與討論 14-1建立函數自定函數的格式如下Function自定函數名稱($arg1,$arg2,...$argn){函數敘述;return函數返回值;}自定函數以Function開始,表示後面要定義一個函數。緊接著就是函數的名稱。$arg表示傳入函數的參數,參數依序排列以","做分隔。函數敘述就是設計者希望處理資料的內容,可以是單行或多行指令。最後return是表示以函數的名稱回傳一個值給主程式,當然主程式也必須要有一個變數來接受函數的回傳值。如果要傳回多個值則必須利用list函數來接收函數傳回的值。 1:數量:$amount
";4:echo"金額:".$price*$amount."
";5:}6:?>7:8:
自定函數9:10:18:19:第2-5行定義一個Pay函數,第3行顯示商品價格和數量,第4行顯示商品金額.在這個範例中函數並沒有回傳值.第11-12價格($Price)和數量($Amount).第13行呼叫Pay函數同時將價格及數量傳入函數.經函數處理後如圖14-1顯示前三行的結果.第14-15行重新定義價格和數量.第16行第2次呼叫Pay函數.當然傳入Pay函數的是第14-15行新設定的價格及數量.經函數處理後如圖顯示後三行的結果. 1:數量:$amount
";4:$S=$price*$amount;5:return$S;6:}7:?>8:9:
自定函數10:11:";16:$Price=60;17:$Amount=50;18:$total2=Pay($Price,$Amount);//第二次呼叫函數19:echo"金額:$total2
";20:$total2+=$total1;21:echo"總金額:$total2";23:?>24:25:函數Pay()會計算總價並利用變數回傳給$total,最後將二項商品金額顯示在網頁上。 1:";4:returnarray("Hello","My","friend");5:}6:?>7:8:
多個回傳值9:10:";13:echo"$msg1$msg2$msg3";14:?>15:16:第2-5行定義函數message().第4行利用array()傳回3個文字串.有3個文字串自函數傳回來,所以第11行利用list()接收回傳值,第1個回傳值對應第1個變數$msg1,依此類推.第13行顯示接收的三個變數. 14-2參數的傳遞自定函數的參數傳遞可以分成二種方式傳址呼叫傳值呼叫 14-2-1傳值呼叫(CallByValue)傳值呼叫的方式是由主程式傳遞變數的值給自訂函數的參數。 1:";4:echo"Price:$Price
Amount:$Amount
";5:$Total=$Price*$Amount;6:echo"TotalinFunctionPay:$Total
";7:}8:?>9:10:
傳值呼叫11:12:";18:echo"Price:$Price
Amount:$Amount
";19:echo"Totalinmain:$Total
";20:?>21:22:範例是使用傳值呼叫,所以一開始第15行$Total起始值為0,然後第16行傳入Pay時會"複製"一個0的值給Pay中的$Total。此時主程式$Total與FunctionPay()的$Total是分別二個不同變數。經函數計算之後第5行$Total值就變成9000而主程式$Total值是0不會改變,因為這二者之間並沒有關係。所以在圖14-2中可以看到在FunctionPay()的$Total=9000,而在main中$Total為0。 14-2-2傳址呼叫(CallByReference)傳址呼叫是傳入變數的位址而不是值,所以函數參數是接受主程式傳來的一個位址。因此參數會指向原變數由於PHP5的預設值不予許使用callbyreference因此需要將PHP.INI中的allow_call_time_pass_reference設定為on才可以使用. 1:";4:echo"Price:$Price
Amount:$Amount
";5:$Total=$Price*$Amount;6:echo"TotalinFunctionPay:$Total
";7:}8:?>9:10:
傳址呼叫11:12:";18:echo"Price:$Price
Amount:$Amount
";19:echo"Totalinmain:$Total
";20:?>21:22:第2行參數$Total前面加上"&"表示變數是傳址呼叫第一種傳址呼叫,'&'是寫在Function中的參數列,所以一定會使用傳址呼叫。 1: ";4:$total=$price*$amount;5:echo"TotalinFunctionPay:$total
";6:echo"
";7:}8:?>9:10:
選擇傳遞方式11:12:
";18:Pay($Price,$Amount,&$Total);19:echo"Totalinmain:$Total<==傳址呼叫
";20:?>21:22:Pay函數一共被呼叫二次,第16行第一次呼叫Pay函數是屬於傳值呼叫的方式。第18行第二次呼叫是傳址呼叫,在呼叫函數時傳入參數的寫法是"&$Total"屬於傳址呼叫。第二種傳址呼叫,由呼叫函數時才決定如何傳遞參數,可依程式不同之需求而選擇傳值或傳址呼叫。 14-3預設參數值在自訂函數撰寫時可以事先給予參數一個預設值,當主程式呼叫函數時有二種選擇。第一種如果主程式有傳值給函數,則函數中參數值即以主程式傳入的值代入。第二種如果主程式沒有傳值給函數,則以函數將以函數定義的預設值帶入參數。其格式如下functionfunc_name(arg1,arg2=n){函數內容}說明:func_name為函數名稱,arg1是第一個參數,第二個參數是arg2,其預設值為n. 1:";4:echo"數量:$amount個
";5:$showcnt=$discount*10;6:echo"折扣:$showcnt折
";7:return$price*$amount*$discount;8:}9:?>10:11:
預設參數12:13:";17:$Discount=0.5;18:$cost=Pay($Price,$Amount,$Discount);//傳入$Discount參數19:echo"總價:$cost元
";20:echo"一般折扣:
";21:$cost=Pay($Price,$Amount);//未傳入$Discount,以預設值帶入22:echo"總價:$cost元";23:?>24:25:$discount被設定了預設值為0.8。當參數設定預設值之後,一旦函數呼叫時未傳入參數值,參數值就會被預設值所取代。 第一點,預設值必須是一個常數,不可以是變數。第二點,預設值的參數必須是在參數列的右邊開始,由右向左延伸。這一點很容易理解,如果有一函數如下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這樣無論是傳入一個參數或二個參數都不會混淆。所以凡是參數有預設值則必須寫在參數列的最右邊開始依序向左延伸。使用預設值的注意事項 14-4可變長度參數一種參數傳輸技巧.配合可變長度參數擷取參數時所使用的函數.func_num_args()會傳回傳入參數的個數.func_get_ars(n)會傳回第n個參數,參數是由第0個開始計算.如果n值大於參數個數則會傳回False.func_get_args()將所有參數以陣列方式傳出. 1:";5:echo"參數內容如下
";6:$op=func_get_args();7:for($i=0;$i<$n;$i++){8:echo"-$op[$i]
";9:}10:}11:?>12:13:
可變長度參數14:15:";17:var_len(10,20);18:echo"
";19:echo"3個參數
";20:var_len("Hello","My","Friend");21:?>22:23:var_len()函數並沒有指定函數個數,由是透過func_num_args()等函數取讀參數個數與內容. 問題與討論參數傳遞時,何謂傳值呼叫與傳址呼叫?何謂預設參數?使用時需注意什麼?請將第9章問題4之商品價格計算式改成自訂函數,並將非會員折扣設定為預設參數。請改寫第12章問題6,將每個數學計算各自寫成一個自訂函數。請比較固定參數與可變長度參數如何傳回一個以上的參數?