麻辣家族討論版版's Archiver

小誌 發表於 2010-5-13 20:02

(PHP+IIS+MsSQL教學第12篇) 函數

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

    //函數敘述區段

}[/code][list]
[*]函數的宣告由「function」保留字開始,而以「}」為函數的結尾。
[*]介於「{」與「}」之間的區段,就是撰寫函數內容敘述的地方。
[*]每個函數的名稱都是獨一無二的,不可使用重複的名稱。
[/list]
例如:[code]function MySub()
{
    echo “函數測試”;
}[/code][color=Sienna]函數的執行[/color]
不要以為我們把上例的函數寫好後,執行程式網頁就會出現「函數測試」這幾個字ㄡ,要執行函數內的程式敘述必須先呼叫執行函數,怎麼呼叫?把函數名稱當成一個敘述就行了:[code]<?
function MySub()
{
  echo "函數測試";
}
?>
<HTML>
<HEAD>
<TITLE>ex04_21</TITLE>
</HEAD>
<BODY>
<?
MySub();  //呼叫函數
?>
</BODY></HTML>[/code][color=Green][size=4][b]函數的參數傳遞[/b][/size][/color]
您喜歡過一成不變單調古板的日子嗎?我想一定是千百個不願意!相對於我們的函數也一樣,例如我們上一個範例,即使它可以被重複呼叫使用,但每次只會呆呆的列印「函數測試」這幾個字,這太不環保了吧!最好是:我希望它輸出什麼它就輸出什麼。

為了讓函數達到真正的實用性,我們可以在函數中加入參數傳遞的功能,例如:[code]//含有一個參數的函數
function MySub($x)
{
  echo $x;
}
//含有兩個參數的函數
function YourSub($y,$z)
{
  echo ($y*$z);
}[/code][color=Sienna]執行有參數的函數[/color]
當我們要呼叫具有參數的函數時,只要在呼叫函數時加入參數資料即可,例如:我們要呼叫上例中的MySub與YourSub函數。[code]//呼叫含有一個參數的函數
MySub("字串輸出");

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


[color=Sienna]傳遞變數給有參數的函數[/color]
當我們要呼叫具有參數的函數時,在呼叫函數時加入的參數資料不一定必須是常數,傳遞變數亦即可,例如:[code]<?
//含有兩個參數的函數
function YourSub($y,$z)
{
  echo ($y*$z);  //輸出答案
}
?>
<HTML>
<HEAD>
<TITLE>ex04_22</TITLE>
</HEAD>
<BODY>
<?
$I=10;
$J=2;
//呼叫含有兩個參數的函數
YourSub($I,$J);
?>
</BODY></HTML>[/code]

小誌 發表於 2010-5-13 20:10

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

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

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

<HTML>
<HEAD>
<TITLE>ex04_23</TITLE>
</HEAD>
<BODY>
<?
$mymoon=date("n");
moontest($mymoon);
?>
</BODY></HTML>[/code][color=Magenta][b]實做練習:[/b][/color]
撰寫一個計算1*2*3*…N計算結果的函數[code]<?
function MyTest($num)
{
$ans=1;
for ($x=1 ; $x<=$num ; $x++)
  {
    $ans=$ans * $x ;
  }
echo $ans;  
}
?>
[/code]

小誌 發表於 2010-5-13 20:16

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

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


[color=Magenta][b]實做學習:[/b][/color]
寫一函數,傳入數字1~12,接著回傳該數字對應的季節,例如傳入參數3回傳「春天」。[code]<?
function moontest($moon)
{
switch ($moon)
  {
    case 1: case 2: case 3:
          return "春天";
          break;
    case 4: case 5: case 6:
          return "夏天";
          break;
    case 7: case 8: case 9:
          return "秋天";
          break;
    case 10: case 11: case 12:
          return "冬天";
          break;
    default:
          echo "錯誤";
  }
}
?>

<HTML>
<HEAD>
<TITLE>test04_01</TITLE>
</HEAD>
<BODY>
<?
//抓取系統日期時間目前的月份
$mymoon=date("n");
//呼叫函數取得對應的季節
$season=moontest($mymoon);
echo "目前季節為 : $season";
?>
</BODY></HTML>
[/code][color=Magenta][b]實做學習:[/b][/color]
寫一函數,將傳入的字串反向列印出來,例如傳入Microsoft回傳輸出tfosorciM,本題有點深度,運用到內建的strlen()、substr()字串函數。[code]<?
function Mystring($testword)
{
$strlong=strlen($testword);
$ansstr="";
for ($x=$strlong ; $x>=0 ; $x--)
  {
    $ansstr=$ansstr . substr($testword,$x,1);
  }
return $ansstr;
}
?>

<HTML>
<HEAD>
<TITLE>test04_02</TITLE>
</HEAD>
<BODY>
<?
$test="Microsoft";
echo (Mystring($test));
?>
</BODY></HTML>
[/code][color=Red]strlen()函數[/color]
語法:strlen(”string”)
用途:計算引數中字串的字元數目(Long)[code]$myStr= “Hello PHP”;
$myLen = strlen($mystr); //$'myLen = 9[/code][color=Red]substr()函數[/color]
語法:strsub(字串, 開始字元, 指定長度)
用途:傳回由字串中指定字元數開始,由左至右取得指定長度字元的字串[code]$myStr= “Hello PHP”;
$strMid = substr($myStr); //$'strMid = "lo P"[/code]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供