Board logo

標題: [教學] (PHP+IIS+MsSQL教學第12篇) 函數 [打印本頁]

作者: 小誌    時間: 2010-5-13 20:02     標題: (PHP+IIS+MsSQL教學第12篇) 函數

函數
函數是將程式敘述獨立出來的一種機制,並且可以在其他的程序中加以呼叫使用,因此,被封裝於副程式中的敘述是不屬於任何的程式區段的,但是,這些敘述卻可以被其他單元重複呼叫使用,所以,我們就會把這些需要重複撰寫的程式敘述封裝起來成為函數,避免因重複撰寫程式敘述而浪費開發時間。其宣告格式如下:
函數宣告格式
  1. function 函數名(參數1, 參數2…)
  2. {

  3.     //函數敘述區段

  4. }
複製代碼

例如:
  1. function MySub()
  2. {
  3.     echo “函數測試”;
  4. }
複製代碼
函數的執行
不要以為我們把上例的函數寫好後,執行程式網頁就會出現「函數測試」這幾個字ㄡ,要執行函數內的程式敘述必須先呼叫執行函數,怎麼呼叫?把函數名稱當成一個敘述就行了:
  1. <?
  2. function MySub()
  3. {
  4.   echo "函數測試";
  5. }
  6. ?>
  7. <HTML>
  8. <HEAD>
  9. <TITLE>ex04_21</TITLE>
  10. </HEAD>
  11. <BODY>
  12. <?
  13. MySub();  //呼叫函數
  14. ?>
  15. </BODY></HTML>
複製代碼
函數的參數傳遞
您喜歡過一成不變單調古板的日子嗎?我想一定是千百個不願意!相對於我們的函數也一樣,例如我們上一個範例,即使它可以被重複呼叫使用,但每次只會呆呆的列印「函數測試」這幾個字,這太不環保了吧!最好是:我希望它輸出什麼它就輸出什麼。

為了讓函數達到真正的實用性,我們可以在函數中加入參數傳遞的功能,例如:
  1. //含有一個參數的函數
  2. function MySub($x)
  3. {
  4.   echo $x;
  5. }
  6. //含有兩個參數的函數
  7. function YourSub($y,$z)
  8. {
  9.   echo ($y*$z);
  10. }
複製代碼
執行有參數的函數
當我們要呼叫具有參數的函數時,只要在呼叫函數時加入參數資料即可,例如:我們要呼叫上例中的MySub與YourSub函數。
  1. //呼叫含有一個參數的函數
  2. MySub("字串輸出");

  3. //含有兩個參數的函數
  4. YourSub(3,5);
複製代碼
以YourSub函數來說,呼叫函數時會以3、5來替代參數y、z的值,所以當執行YourSub函數內的「echo($y*$z);」敘述時,就會在網頁中輸出3乘5的結果15。
[attach]381[/attach]


傳遞變數給有參數的函數
當我們要呼叫具有參數的函數時,在呼叫函數時加入的參數資料不一定必須是常數,傳遞變數亦即可,例如:
  1. <?
  2. //含有兩個參數的函數
  3. function YourSub($y,$z)
  4. {
  5.   echo ($y*$z);  //輸出答案
  6. }
  7. ?>
  8. <HTML>
  9. <HEAD>
  10. <TITLE>ex04_22</TITLE>
  11. </HEAD>
  12. <BODY>
  13. <?
  14. $I=10;
  15. $J=2;
  16. //呼叫含有兩個參數的函數
  17. YourSub($I,$J);
  18. ?>
  19. </BODY></HTML>
複製代碼

作者: 小誌    時間: 2010-5-13 20:10

函數的放置位置
函數完成了,那我們要放在哪裡呢?直接放置在「<? ?>」之中就好了ㄚ!例如下例,粗體字的部分的部分就是函數區段,而粗體字的部分之外的就是主程式的區段:
  1. <?
  2. $mymoon=date("n");
  3. moontest($mymoon);

  4. function moontest($moon)
  5. {
  6. switch ($moon)
  7.   {
  8.     case 1: case 2: case 3:
  9.           echo "春天";
  10.           break;
  11.     case 4: case 5: case 6:
  12.           echo "夏天";
  13.           break;
  14.     case 7: case 8: case 9:
  15.           echo "秋天";
  16.           break;
  17.     case 10: case 11: case 12:
  18.           echo "冬天";
  19.           break;
  20.     }
  21. }
  22. ?>
複製代碼
函數是將「程式敘述獨立出來」的一種機制,並且可以在其他的程序中加以呼叫使用,所以,應該儘量避免將函數混雜於其他程式區段中,通常我們都會將函數區段擺放於主程式區段的最上方或最下方。
[attach]382[/attach]

您不必擔心呼叫函數後,程式敘述進入函數以後就回不來了,當我們呼叫副程式而進入副程式敘述區段後,副程式中的敘述逐一執行後,遇到『}』時,函數就會結束而「返回」呼叫函數敘述的下一個敘述繼續執行。
不過,筆者習慣將函數獨立使用一組「<? ?>」保括起來,並擺放於PHP網頁程式中的最上方:
  1. <?
  2. function moontest($moon)
  3. {
  4. switch ($moon)
  5.   {
  6.     case 1: case 2: case 3:
  7.           echo "春天";
  8.           break;
  9.     case 4: case 5: case 6:
  10.           echo "夏天";
  11.           break;
  12.     case 7: case 8: case 9:
  13.           echo "秋天";
  14.           break;
  15.     case 10: case 11: case 12:
  16.           echo "冬天";
  17.           break;
  18.     default:
  19.           echo "錯誤";
  20.   }
  21. }
  22. ?>

  23. <HTML>
  24. <HEAD>
  25. <TITLE>ex04_23</TITLE>
  26. </HEAD>
  27. <BODY>
  28. <?
  29. $mymoon=date("n");
  30. moontest($mymoon);
  31. ?>
  32. </BODY></HTML>
複製代碼
實做練習:
撰寫一個計算1*2*3*…N計算結果的函數
  1. <?
  2. function MyTest($num)
  3. {
  4. $ans=1;
  5. for ($x=1 ; $x<=$num ; $x++)
  6.   {
  7.     $ans=$ans * $x ;
  8.   }
  9. echo $ans;  
  10. }
  11. ?>
複製代碼

作者: 小誌    時間: 2010-5-13 20:16

函數的回傳值
前面我們說明了函數的使用方法與參數的傳遞,但是呼叫函數後,函數直接將處理結果在函數內就輸出至網頁中,嚴格來說,這種類型的函數只能稱之為「副程式(Subprogram)」,因為函數沒有將處理結果傳回呼叫它的主程式區段。

要讓將處理結果傳回呼叫它的主程式區段,可在函數即將結束之前,使用「return」命令傳回特定的資料值成為函數的回傳值,例如:
  1. <?
  2. function MyTest($num)
  3. {
  4. $ans=1;
  5. for ($x=1 ; $x<=$num ; $x++)
  6.   {
  7.     $ans=$ans * $x ;
  8.   }
  9. return $ans;  //回傳運算結果
  10. }
  11. ?>
複製代碼
提示
呼叫函數時,有參數傳遞時,參數之外要用一對括號包括起來,若無參數傳遞時,加不加括號都可以,不過,習慣上在呼叫函數時,即使沒有參數傳遞都還是會加上一對括號。


實做學習:
寫一函數,傳入數字1~12,接著回傳該數字對應的季節,例如傳入參數3回傳「春天」。
  1. <?
  2. function moontest($moon)
  3. {
  4. switch ($moon)
  5.   {
  6.     case 1: case 2: case 3:
  7.           return "春天";
  8.           break;
  9.     case 4: case 5: case 6:
  10.           return "夏天";
  11.           break;
  12.     case 7: case 8: case 9:
  13.           return "秋天";
  14.           break;
  15.     case 10: case 11: case 12:
  16.           return "冬天";
  17.           break;
  18.     default:
  19.           echo "錯誤";
  20.   }
  21. }
  22. ?>

  23. <HTML>
  24. <HEAD>
  25. <TITLE>test04_01</TITLE>
  26. </HEAD>
  27. <BODY>
  28. <?
  29. //抓取系統日期時間目前的月份
  30. $mymoon=date("n");
  31. //呼叫函數取得對應的季節
  32. $season=moontest($mymoon);
  33. echo "目前季節為 : $season";
  34. ?>
  35. </BODY></HTML>
複製代碼
實做學習:
寫一函數,將傳入的字串反向列印出來,例如傳入Microsoft回傳輸出tfosorciM,本題有點深度,運用到內建的strlen()、substr()字串函數。
  1. <?
  2. function Mystring($testword)
  3. {
  4. $strlong=strlen($testword);
  5. $ansstr="";
  6. for ($x=$strlong ; $x>=0 ; $x--)
  7.   {
  8.     $ansstr=$ansstr . substr($testword,$x,1);
  9.   }
  10. return $ansstr;
  11. }
  12. ?>

  13. <HTML>
  14. <HEAD>
  15. <TITLE>test04_02</TITLE>
  16. </HEAD>
  17. <BODY>
  18. <?
  19. $test="Microsoft";
  20. echo (Mystring($test));
  21. ?>
  22. </BODY></HTML>
複製代碼
strlen()函數
語法:strlen(”string”)
用途:計算引數中字串的字元數目(Long)
  1. $myStr= “Hello PHP”;
  2. $myLen = strlen($mystr); //$'myLen = 9
複製代碼
substr()函數
語法:strsub(字串, 開始字元, 指定長度)
用途:傳回由字串中指定字元數開始,由左至右取得指定長度字元的字串
  1. $myStr= “Hello PHP”;
  2. $strMid = substr($myStr); //$'strMid = "lo P"
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)