Presentation is loading. Please wait.

Presentation is loading. Please wait.

PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 14 章 自定函數.

Similar presentations


Presentation on theme: "PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 14 章 自定函數."— Presentation transcript:

1 PHP5與MySQL 入門學習指南 凱文瑞克 著 第 14 章 自定函數

2 本章大綱 14-1 建立函數 14-2 參數的傳遞 14-3 預設參數值 14-4 可變長度參數 問題與討論

3 14-1 建立函數 自定函數的格式如下 Function 自定函數名稱 ($arg1, $arg2, ... $argn) { 函數敘述 ;
return 函數返回值 ; } 自定函數以 Function 開始, 表示後面要定義一個函數。緊接著就是函數的名稱。$arg 表示傳入函數的參數, 參數依序排列以 "," 做分隔。函數敘述就是設計者希望處理資料的內容, 可以是單行或多行指令。最後 return 是表示以函數的名稱回傳一個值給主程式, 當然主程式也必須要有一個變數來接受函數的回傳值。如果要傳回多個值則必須利用 list函數來接收函數傳回的值。

4 1: <?php 2: Function Pay($price,$amount) { 3: echo "價格 : $price <br> 數量 : $amount <br>\n"; 4: echo "金額: ".$price * $amount."<p>" ; 5: } 6: ?> 7: <html> 8: <title>自定函數</title> 9: <body> 10: <?php 11: $Price=90 ; 12: $Amount=100 ; 13: Pay($Price, $Amount) ; //第一次呼叫函數 14: $Price=60 ; 15: $Amount=50 ; 16: Pay($Price, $Amount) ; //第二次呼叫函數 17: ?> 18: </body> 19: </html> 第 2-5 行定義一個 Pay 函數, 第 3 行顯示商品價格和數量, 第 4 行顯示商品金額. 在這個範例中函數並沒有回傳值. 第 價格 ($Price) 和數量 ($Amount). 第 13 行呼叫 Pay 函數同時將價格及數量傳入函數. 經函數處理後如圖 14-1 顯示前三行的結果. 第 行重新定義價格和數量. 第 16 行第 2 次呼叫 Pay 函數. 當然傳入 Pay 函數的是第 行新設定的價格及數量. 經函數處理後如圖 顯示後三行的結果.

5 函數 Pay() 會計算總價並利用變數回傳給 $total, 最後將二項商品金額顯示在網頁上。
1: <?php 2: Function Pay($price,$amount) { 3: echo "價格 : $price <br> 數量 : $amount <br>\n"; 4: $S=$price * $amount ; 5: return $S ; 6: } 7: ?> 8: <html> 9: <title>自定函數</title> 10: <body> 11: <?php 12: $Price=90 ; 13: $Amount=100 ; 14: $total1= Pay($Price, $Amount) ; //第一次呼叫函數 15: echo "金額 : $total1 <p>" ; 16: $Price=60 ; 17: $Amount=50 ; 18: $total2 = Pay($Price, $Amount) ; //第二次呼叫函數 19: echo "金額 : $total2<p>" ; 20: $total2+=$total1; 21: echo "總金額 : $total2" ; 23: ?> 24: </body> 25: </html> 函數 Pay() 會計算總價並利用變數回傳給 $total, 最後將二項商品金額顯示在網頁上。

6 1: <?php 2: function message() { 3: echo "函數回傳三個數值.<p>"; 4: return array("Hello", "My", "friend"); 5: } 6: ?> 7: <html> 8: <title>多個回傳值</title> 9: <body> 10: <?php 11: list($msg1, $msg2, $msg3)=message(); 12: echo "主程式接收多個訊息如下<br>"; 13: echo "$msg1 $msg2 $msg3"; 14: ?> 15: </body> 16: </html> 第 2-5 行定義函數 message(). 第 4 行利用 array() 傳回 3 個文字串. 有 3 個文字串自函數傳回來, 所以第 11 行利用 list() 接收回傳值, 第 1 個回傳值對應第 1 個變數 $msg1, 依此類推. 第 13 行顯示接收的三個變數.

7 14-2 參數的傳遞 自定函數的參數傳遞可以分成二種方式 傳址呼叫 傳值呼叫

8 傳值呼叫(Call By Value) 傳值呼叫的方式是由主程式傳遞變數的值給自訂函數的參數。

9 1: <?php 2: Function Pay($Price, $Amount, $Total) { 3: echo "=========== in Function Pay ======== <br>" ; 4: echo "Price : $Price <br> Amount : $Amount <br>\n"; 5: $Total=$Price * $Amount ; 6: echo "Total in Function Pay : $Total <p>\n" ; 7: } 8: ?> 9: <html> 10: <title>傳值呼叫</title> 11: <body> 12: <?php 13: $Price=90 ; 14: $Amount=100 ; 15: $Total=0 ; 16: Pay($Price, $Amount, $Total) ; 17: echo "============== in Main ===========<br>" ; 18: echo "Price : $Price <br> Amount : $Amount <br>\n"; 19: echo "Total in main : $Total<br>" ; 20: ?> 21: </body> 22: </html> 範例是使用傳值呼叫, 所以一開始第 15 行 $Total 起始值為 0, 然後第 16 行傳入 Pay 時會"複製"一個 0 的值給 Pay 中的 $Total。此時主程式 $Tota l與 Function Pay() 的 $Total 是分別二個不同變數。經函數計算之後第 5 行 $Total 值就變成 9000 而主程式 $Total 值是 0 不會改變, 因為這二者之間並沒有關係。所以在圖 14-2 中可以看到在 Function Pay() 的 $Total=9000, 而在 main 中 $Total 為 0。

10 14-2-2 傳址呼叫(Call By Reference)
傳址呼叫是傳入變數的位址而不是值, 所以函數參數是接受主程式傳來的一個位址。因此參數會指向原變數 由於 PHP 5 的預設值不予許使用 call by reference 因此需要將 PHP.INI 中的 allow_call_time_pass_reference 設定為 on才可以使用.

11 第 2 行參數 $Total 前面加上 "&" 表示變數是傳址呼叫
1: <?php 2: Function Pay($Price, $Amount, &$Total) { 3: echo "=========== in Function Pay ========== <br>" ; 4: echo "Price : $Price <br> Amount : $Amount <br>\n"; 5: $Total=$Price * $Amount ; 6: echo "Total in Function Pay : $Total <p>\n" ; 7: } 8: ?> 9: <html> 10: <title>傳址呼叫</title> 11: <body> 12: <?php 13: $Price=90 ; 14: $Amount=100 ; 15: $Total=0 ; 16: Pay($Price, $Amount, $Total) ; 17: echo "============== in Main ==============<br>" ; 18: echo "Price : $Price <br> Amount : $Amount <br>\n"; 19: echo "Total in main : $Total<br>" ; 20: ?> 21: </body> 22: </html> 第 2 行參數 $Total 前面加上 "&" 表示變數是傳址呼叫 第一種傳址呼叫, '&' 是寫在Function 中的參數列, 所以一定會使用傳址呼叫。

12 第二種傳址呼叫, 由呼叫函數時才決定如何傳遞參數, 可依程式不同之需求而選擇傳值或傳址呼叫。
1: <?php 2: Function Pay($price, $amount, $total) { 3: echo "Price : $price Amount : $amount <br>\n"; 4: $total=$price * $amount ; 5: echo "Total in Function Pay : $total <br>\n" ; 6: echo "<p>\n" ; 7: } 8: ?> 9: <html> 10: <title>選擇傳遞方式</title> 11: <body> 12: <?php 13: $Price=90 ; 14: $Amount=100 ; 15: $Total=0 ; 16: Pay($Price, $Amount, $Total) ; 17: echo "Total in main : $Total <== 傳值呼叫<hr><p>\n" ; 18: Pay($Price, $Amount, &$Total) ; 19: echo "Total in main : $Total <== 傳址呼叫<hr>" ; 20: ?> 21: </body> 22: </html> Pay 函數一共被呼叫二次, 第 16 行第一次呼叫 Pay 函數是屬於傳值呼叫的方式。第 18 行第二次呼叫是傳址呼叫, 在呼叫函數時傳入參數的寫法是 "&$Total" 屬於傳址呼叫。 第二種傳址呼叫, 由呼叫函數時才決定如何傳遞參數, 可依程式不同之需求而選擇傳值或傳址呼叫。

13 14-3 預設參數值 在自訂函數撰寫時可以事先給予參數一個預設值, 當主程式呼叫函數時有二種選擇。
第一種如果主程式有傳值給函數, 則函數中參數值即以主程式傳入的值代入。 第二種如果主程式沒有傳值給函數, 則以函數將以函數定義的預設值帶入參數。 其格式如下 function func_name(arg1, arg2=n) { 函數內容 } 說明: func_name 為函數名稱, arg1 是第一個參數, 第二個參數是 arg2, 其預設值為 n.

14 $discount 被設定了預設值為 0.8。當參數設定預設值之後, 一旦函數呼叫時未傳入參數值, 參數值就會被預設值所取代。
1: <?php 2: function Pay($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: <html> 11: <title>預設參數</title> 12: <body> 13: <?php 14: $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: </body> 25: </html> $discount 被設定了預設值為 0.8。當參數設定預設值之後, 一旦函數呼叫時未傳入參數值, 參數值就會被預設值所取代。

15 使用預設值的注意事項 第一點, 預設值必須是一個常數, 不可以是變數。
第二點, 預設值的參數必須是在參數列的右邊開始, 由右向左延伸。這一點很容易理解, 如果有一函數如下 Function test ($A=10, $B) 在函數呼叫時僅傳入一個數值 test (20) ; 這個時候 20 是應該傳給 $A 還是 $B ? 由此可知上面的寫法有問題。如果函數改寫如下: Function test($B, $A=10) 則函數呼叫 test(20) ; //$B=20, $A=10(預設值) test(20,15) ; //$B=20, $A=15 這樣無論是傳入一個參數或二個參數都不會混淆。所以凡是參數有預設值則必須寫在參數列的最右邊開始依序向左延伸。

16 14-4 可變長度參數 一種參數傳輸技巧. 配合可變長度參數擷取參數時所使用的函數. func_num_args() 會傳回傳入參數的個數.
func_get_ars(n) 會傳回第 n 個參數, 參數是由第 0 個開始計算. 如果 n 值大於參數個數則會傳回 False. func_get_args() 將所有參數以陣列方式傳出.

17 var_len() 函數並沒有指定函數個數, 由是透過 func_num_args()等函數取讀參數個數與內容.
1: <?php 2: function var_len(){ 3: $n=func_num_args(); 4: echo "總共傳入".$n."個參數<br>"; 5: echo "參數內容如下<br>"; 6: $op=func_get_args(); 7: for ($i=0; $i<$n; $i++){ 8: echo "- $op[$i] <br>"; 9: } 10: } 11: ?> 12: <html> 13: <title>可變長度參數</title> 14: <body> 15: <?php 16: echo "2個參數 <br>"; 17: var_len(10,20); 18: echo "<p>"; 19: echo "3個參數 <br>"; 20: var_len("Hello","My","Friend"); 21: ?> 22: </body> 23: </html> var_len() 函數並沒有指定函數個數, 由是透過 func_num_args()等函數取讀參數個數與內容.

18 問題與討論 參數傳遞時,何謂傳值呼叫與傳址呼叫? 何謂預設參數?使用時需注意什麼?
請將第 9 章問題4之商品價格計算式改成自訂函數,並將非會員折扣設定為預設參數。 請改寫第 12 章問題 6,將每個數學計算各自寫成一個自訂函數。 請比較固定參數與可變長度參數 如何傳回一個以上的參數?


Download ppt "PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 14 章 自定函數."

Similar presentations


Ads by Google