如何定義 function PHP
的函數定義是利用 function 關鍵字,語法:
function func_name(傳入參數1, 傳入參數2, ...) {
...
程式區
...
}
函數可以讓我們的程式更具可讀性,也符合模組化程式設計的原則。底下是一個定義函數的範例:
function IsAlpha($x) {
if ($x >= 'a' && $x <= 'z') return TRUE;
if ($x >= 'A' && $x <= 'Z') return TRUE;
return FALSE;
}
注意事項:
在 PHP3
裡,函數必須在第一次被呼叫之前就被定義,否則會出錯,在檔案裡,則是循序順序,也就是,假如
IsAlpha()
要被呼叫,則在呼叫他的那行程式碼之「前」,必須有定義 IsAlpha()
函數的程式碼。不過,PHP4 裡則沒有這個限制。
只要是符合 PHP 語法的敘述,都可以寫在 function 裡,包括其它的
function 或 class。另外,由於 PHP 並不支援 function overloading,所以我們無法重新宣告一個已經宣告過的函數。
函數的命名規定
使用者自定函數的名稱命名有三個限制:
- 不能與 PHP 的函數名稱同名。例如名稱不能為 mysql_pconnect()。
- 函數名稱不能以數字開頭。
- 函數名稱不能使用 "." (period),例如 add.integer()
就是一個錯誤的函數名稱。
參數傳遞與傳回值
PHP 支援 call by value 與 call by reference
兩種傳遞參數的方法,並且在函數執行結束後,可以利用 return
傳回一個值給父程式。
call by value
call by value
是父程式直接將值或變數傳給函數,因此該數值或變數被儲存於兩個不同的記憶體位置。當傳入一個變數時,在函數裡改變傳入的參數值對父程式的變數並不會造成影嚮。
範例:
function sum($x, $y) {
$x += $y;
return $x;
}
$x = 25;
$y = 10;
echo sum($x, $y); // 輸出 35;
echo $x;
// 輸出 25
因為參數的傳遞使用 call by value 的方式,因此父程式的 $x 與 sum()
函數的 $x
變數不會互相影嚮。這是因為這二個變數是分別位於兩個不同的記憶體位置的關係。
call by reference
call by reference 是一種非常好用的機制,以 C++
的程式碼為例,底下是一個將大寫字母轉小寫的範例:
char &UpperAlpha(char &x) {
return
(x >= 'A' && x <= 'Z') ? x : x|=0x20;
}
void main(void)
{
char x = 'Q';
clrscr();
printf("\nx = %c", x);
printf("\nReturn: %c", UpperAlpha(x));
printf("\nx = %c", x);
}
x 為 'Q' 時,輸出為:
x = Q
Return: q
x = q
當 x 為 '9' 時,輸出為:
x = 9
Return: 9
x = 9
利用 call by reference
傳入一個變數參考時,等於是將指向該變數的指標傳給函數,在函數裡改變該參考等於改變原來的變數值,因此可以達到改變原來變數值的效果。利用
call by reference
傳遞傳數時,傳入的變數與函數裡的參數變數位於相同的記憶體位置。
在 PHP 程式裡如果要傳遞參考 (call by reference)
的話,有二種做法,我們可選擇適合我們使用的方法:
1. 呼叫函數時在變數前加上 &,例如:
add(&$x, $y);
此時 add() 的寫法沒有什麼不同:
function add($x, $y) {
$x += $y;
}
2. 在函數的參數加上 &,例如:
function add(&$x, $y) {
$x += $y;
}
此時呼叫函數的寫法:
add($x, $y);
二種寫法實際上是有所不同的。第一種寫法是呼叫函數時在變數前加上
&,種寫法可以讓我們在呼叫函數時才決定是否要採用 call by
reference 的方式傳遞參數。而第二種寫法是在函數的傳入值前加上
&,這種寫法會強迫使用 call by reference
的方式傳遞參數,而不管呼叫函數時是採取 call by value 或是 call by
reference 的方式。
善用二種方式間的差異可以幫助我們維護程式的品質。例如,當我們的函數必須替父程式維護傳入變數值時,這時就可以強迫函數的傳入值採取
call by reference 的方式,如此就算我們呼叫函數時手誤少打了一個
"&",也可以正確採取 call by reference 的方式。
參數預設值
參數預設值就是,當我們沒有傳入值給該參數時,該參數即以預設值來工作,例如:
function add($x = 1, $y = 2) {
return $x+$y;
}
echo add(); // 結果為 3
上面這個範例中,因為我們並沒有傳入值給參數,所以 $x 與 $y
的預設值即為 1 與 2,所以傳回的結果為 3。
上預設值的參數必須全部靠右,例如:
function add($x, $y = 1, $z = 2) {
return $x+$y+$z; //傳回值 (return value)
}
echo add(5);
//
結果為 8
傳回值
在前面的範例中,我們直接以 return [value]
的方式將值傳回給父程式。由於一個函數只會有一個有效的 return,所以只能有一個傳回值。
如何傳回多個值
如果要傳回多個值,可以利用傳回陣列的小技巧來達成,例如:
function test() {
return array(10, 20, 30, 40, 50);
}
因為傳回給父程式的是一個陣列,因此父程式必須利用 list()
函數才能將陣列的值分別指定給變數。
範例:
list($a, $b, $c, $d, $e) = test();
echo $a; // 輸出為 10
echo $b; // 輸出為 20
echo $c; // 輸出為 30
echo $d; // 輸出為 40
echo $e; // 輸出為 50
可變函數名稱
一般函數名稱在定義函數時即決定好,但 PHP
提供一種技術,可以讓我們將函數的名稱存放在一個變數裡,當呼叫這個變數時,即等於呼叫變數值相對應的函數。這種可以利用變數指定不同函數名稱的技術即稱為可變函數名稱。
底下是一個簡單的可變函數應用範例:
function male() {
...
}
function female() {
...
}
if ($sex == "male")
person$ = 'male';
else
person$ = 'female';
$person();
我們可在程式裡變態改動可變函數的名稱,如此即可完成呼叫同一個函數,但執行不同函數的效果。 |