Jollen 網路學院
|| Jollen 的 Embedded Linux 訓練方案 | Jollen 的 Embedded Linux 系列著作 ||
□ Jollen網路學院 >> PHP 讀者服務 >> PHP 線上教材 □

CH9: PHP 函數設計

在這篇文章裡,你可以學到:

  • 如何定義 function
  • 函數的命名規定
  • 參數傳遞與傳回值
  • 參數預設值
  • 傳回值
  • 如何傳回多個值
  • 可變函數名稱

如何定義 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,所以我們無法重新宣告一個已經宣告過的函數。

函數的命名規定

使用者自定函數的名稱命名有三個限制:

  1. 不能與 PHP 的函數名稱同名。例如名稱不能為 mysql_pconnect()。
  2. 函數名稱不能以數字開頭。
  3. 函數名稱不能使用 "." (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();

我們可在程式裡變態改動可變函數的名稱,如此即可完成呼叫同一個函數,但執行不同函數的效果。

PHP 線上教材
· CH1: 什麼是 PHP
· CH2: PHP 的用途
· CH3: PHP 的優點
· CH4: Hello, world!
· CH5: 如何安裝 PHP
· CH6: PHP 入門觀念
· CH7: PHP 基本語法
· CH8: PHP 常數與變數
· CH9: PHP 函數設計
· CH10: PHP 運算元
· CH11: PHP Expression
· CH12: PHP 陣列
· CH13: PHP Class設計
· CH14: PHP 良好習慣
回首頁 |  TOP |
    Copyright (c) 2006 www.jollen.org
All rights reserved. 更新日期: 2006/04/11