在寫程式時,有許多時候是需要有一些重複的片段不斷執行的例子,而它不一定會在哪裡被拿來使用,而最需要的時候就要再做一次。這一類型的經常會被拿來使用的程式碼,我們會把它們集合起來給個名字,之後再視需要時「呼叫」它來執行,此種方式即為副程式,也就是函數function的機制。
簡單地說,在PHP程式中,當某一段程式碼需要經常被使用到時,就會用function定義它,定義的方式如下:
function 函數名稱(參數表列) {
函數內要被執行的指令區塊;
return 傳回值;
}
大部份的情況下我們會先定義函數,把所有程式中可能會用到的函數都放在程式的最前面,當需要用到時再以函數的名稱來呼叫執行即可。
請參考以下的例子:
<?php
function show_messages() {
for($i=0; $i<5; $i++) echo "Hello~~<br/>\n";
}
show_messages();
echo "----------<br/>\n";
show_messages();
?>
上述程式在瀏覽器中的執行結果如下:
Hello~~
Hello~~
Hello~~
Hello~~
Hello~~
----------
Hello~~
Hello~~
Hello~~
Hello~~
Hello~~
其HTML原始碼如下所示:
Hello~~<br/>
Hello~~<br/>
Hello~~<br/>
Hello~~<br/>
Hello~~<br/>
----------<br/>
Hello~~<br/>
Hello~~<br/>
Hello~~<br/>
Hello~~<br/>
Hello~~<br/>
為了讓HTML原始碼的格式更美觀,同時也兼顧在網頁上的換列需求,在這個程式中的echo指令後面我們同時使用了<br/>和\n,這是和之前的範例程式不同之處。
要發揮函數最大的用途是參數的傳遞。上面的那個程式每次呼叫的時候都只能固定產生5個訊息,但其實產生的訊息數量應該是要能夠在呼叫的時候透過參數決定的,加上參數的函數功能之範例程式如下所示:
<?php
function show_messages($times) {
for($i=0; $i<$times; $i++) echo "$i:Hello~~<br/>\n";
}
show_messages(3);
echo "----------<br/>\n";
show_messages(5);
?>
程式中我們先以3作為參數呼叫,之後再以5作為參數呼叫,同時為了要辨別輸出的個數,在輸出時也一併把$i的內容顯示出來。上面這個程式的輸出結果就會變成如下所示的樣子:
0:Hello~~
1:Hello~~
2:Hello~~
----------
0:Hello~~
1:Hello~~
2:Hello~~
3:Hello~~
4:Hello~~
加權成績計算函數
有了自訂函數的能力,就可以把一些常見的算式變成函數,再以加上參數呼叫的方式來簡化程式的內容,請看以下這個加權成績計算的例子:
<?php
function compute_weighted($chi, $eng, $math) {
$score = $chi * 6 + $eng * 4 + $math * 4;
$average = $score / 14;
echo "Score:$score, weighted average:$average<br/>\n";
}
function compute($chi, $eng, $math) {
$score = $chi + $eng + $math;
$average = $score / 3;
echo "Score:$score, unweighted average:$average<br/>\n";
}
compute(50, 90, 82);
compute_weighted(50, 90, 82);
echo "-----------------<br/>\n";
compute(60, 85, 90);
compute_weighted(60, 85, 90);
?>
此程式在瀏覽器中執行的結果如下:
Score:222, unweighted average:74
Score:988, weighted average:70.571428571429
-----------------
Score:235, unweighted average:78.333333333333
Score:1060, weighted average:75.714285714286
從輸出的結果可以看出有無加權對於平均分數的影響。
階乘函數的應用
前面的文章中我們曾經示範過階乘函數的計算,那時我們把計算的邏輯放在主程式的迴圈中,現在學會了自訂函數的應用之後,把這些計算式拿出來作為函數會讓主程式變得更容易地理解,以下即為自訂階乘函數的應用範例:
<?php
function factorial($number) {
$res = 1;
for($i=1; $i<=$number; $i++) {
$res *= $i;
}
return $res;
}
for ($i=1; $i<=20; $i++) {
echo "$i!=".number_format(factorial($i))."<br/>\n";
}
?>
關於內建函數
許多的功能其實都有現成的函數可以拿來使用,在這裡我們只是示範如何自訂函數,事實上階乘函數也有內建函數可以使用。
number_format函數
此函數可以把數值進行自訂格式化的輸出,直接把數值傳遞進去,它可以幫我們把數值自動加上千分位記號。
在程式中我們定義了factorial這個函數,只要傳遞一個參數給它之後,它就會傳回該數的階乘值。定義了這個函數之後,即可在主程式中不斷地呼叫它,就可以利用此函數計算出大量的階乘函數數值。執行結果如下所示:
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5,040
8!=40,320
9!=362,880
10!=3,628,800
11!=39,916,800
12!=479,001,600
13!=6,227,020,800
14!=87,178,291,200
15!=1,307,674,368,000
16!=20,922,789,888,000
17!=355,687,428,096,000
18!=6,402,373,705,728,000
19!=121,645,100,408,832,000
20!=2,432,902,008,176,640,000