PHP 是什麼呢,簡單的說 PHP 是 Unix 系統上的 ASP,這樣一說相信大家應都知道 PHP 大概是什麼了吧。和 ASP 相比,PHP 似乎不太有人去注意,但其實國外使用 PHP 來建構網站己有很長的一段時間了,而國內現在也慢慢的對 PHP 有所重視了。
自定函數

  函數是用來封裝敘述區塊的程式單元,被封裝在函數裡的敘述區塊,並不屬於其它任何的敘述,這些敘述只要被定義一次,我們就能從其它的地方來呼叫、使用它們。因此我們會把經常重複撰寫的敘述區塊編寫成一個函數,以節省開發的時間。函數能讓你所寫的程式具有模組化及結構化的架構,原本必須重複編寫的程,式現在只要寫一次,我們隨時都可以使用。
  有些函數是 PHP 本身所寫好的我們稱為『內建函數』,例如:Date、intval 等等,而另一種可由我們自己所建立的函數則為『自定函數』,本章園丁所要介紹的就是自定函數。

定義函數

  在 PHP 中的函數定義是使用 function 關鍵字,語法為:
function 函數名稱(傳入參數1,傳入參數2,...)
{
  敘述;
   :
   :
}

函數命名規則
  自定函數的名稱有以下四個限制:

  • 自定函數名稱不能使用 PHP 的保留字。
  • 自定函數名稱不能和 PHP 的內建函數的名稱相同。
  • 自定函數名稱不能以數字開頭。
  • 自定函數名稱不能使用「.(period)」符號。
如以下就是一些錯誤的函數名稱
錯誤名稱: 說明:
function while()
function Date()
function 99Times()
function add.integer()
使用了 PHP 的保留字
使用了 PHP 的內建函數名稱
開頭為數字
使用了「.(period)」符號

  只要是符合 PHP 的語法都可以寫在函數中的敘述語法內,包括其他的 function 或 class。在 PHP3 中函數必須在第一次被使用時就要宣告,否則會出現錯誤,但 PHP4 中無此限制。

傳遞參數及傳回值

  在呼叫參數時可利用傳遞參數的方法將某些資料傳給參數來使用,而在函數結束時可利用 return 的方式傳回一個值給父程式。傳遞參數的方法有兩種,分別是 call by value 與 call by reference 兩種。
call by value
  call by value 的傳值方法是將傳入的參數存放在另一個記憶位置,因此當傳入一個參數時,在函數中對所傳入的參數所做的改變是不會對父程式的變數造成影響的,如以下的範例:
範例: 說明:
function add($x,$y)
{
	$x = $x + $y;
	return $x;
}

$x = 10;
$y = 15;
echo add($x,$y);
echo $x;
由於傳遞參數的方法是使用 call by value 
因此最後的輸出結果為 25 及 10
因為函數中的變數與公程式的變數是存放在不同的記憶位置中,
所以函數中的 $x 所做的改變不會影響到父程式的 $x 變數

call by reference
  call by reference 的傳值方法是將傳入的變數指標傳給函數,也就是說,所傳遞的參數其記憶位置與父程式的變數是相同的,因此當函數中對此參數所做的改變等於是改變了父程式的變數。
  在 PHP 中要使用 call by reference 的傳值方法有兩種做法:

方法一:在呼叫函數時在變數前加上 & 如:
範例:
  add(&$x,$y)
  此時函數 add() 的寫法沒有改變:
  function add($x,$y)
  {
  	$x = $x + $y;
  	return $x;
  }

方法二:在函數的參數上加 & 如:
範例:
  function add(&$x,$y)
  {
  	$x = $x + $y;
  	return $x;
  }
  此時呼叫的方法沒有改變:
  add($x,$y)

  第一種方法是在呼叫時才決定是否要使用 call by reference 的方式來傳遞參數,而第二種方法則是不論呼叫時是使用 call by value 或 call by reference 都強迫使用 call by reference 的傳遞方法。以下是兩種呼叫的範例:
  
範例: 輸出結果: 說明:
function add($x,$y)
{
	$x = $x + $y;
	return $x;
}

$x = 10;
$y = 15;
echo '$x+$y='.add(&$x,$y).'<br>';
echo '$x='.$x.'<br>'.'$y='.&y;
$x+$y=25
$x=25
$y=15
使用方法一的 call by reference 傳值法
.」 是字串的連結符號,沒有忘記吧
function add(&$x,$y)
{
	$x = $x + $y;
	return $x;
}

$x = 10;
$y = 15;
echo '$x+$y='.add($x,$y).'<br>';
echo '$x='.$x.'<br>'.'$y='.&y;
$x+$y=25
$x=25
$y=15
使用方法二的 call by reference 傳值法
.」 是字串的連結符號,沒有忘記吧

使用 call by reference 的參數傳遞方式,其所傳遞的參數必須要以變數來傳遞,不要使用常數或直接指定的值,因為常數或直接指定的值是不能改變的。

參數的預設值

  參數的預設值就是,當我們沒有傳值變函數中的參數時,則該參數就會使用此預設值。如:
範例: 輸出結束:
function add($x,$y=10)
{
	$x = $x + $y;
	return $x;
}

echo add(5);
15

上面的範例中,我們只傳遞了一個參數,因此函數只接收了 5 給 $x 而 $y 則使用預設值也就是 10 ,所以傳回的結果為 15 。
使用預設值時要注意一點,就是預設值的參數必須全部靠右。如以下就是錯誤的例子:
範例:
function add($x=10,$y)
{
	$x = $x + $y;
	return $x;
}

function add3($x=10,$y,$z=15)
{
	$x = $x + $y + $z;
	return $x;
}

這是因為 PHP 的函數是由左而右依序放入參數值的原故,錯誤的寫法會使得 PHP 認為參數傳遞不足。
範例: 錯誤說明:
function add($x=10,$y)
{
	$x = $x + $y;
	return $x;
}

echo add(5);
此時由於 $x 會使用所傳入的值而變成 5 ,
但 $y 沒有傳入值,因此會產生錯誤

傳回值

  函數可利用 return 來傳回一個值,而傳回值的型態可為任何型別,包括物件(Object)也可以當成傳回值。
範例: 輸出說明:
function add($x,$y)
{
	$x = $x + $y;
	return $x;
}

echo add(5,10);
利用 return 將函數中的 $x 傳回,
所以得到的結果為 15

  由於 return 只能傳回一個結果,那當有多個傳回值時該如何呢?此時我們可利用陣列來達成,如:
範例: 所得結果:
function add($x,$y)
{
	$z = $x + $y;
	return array($x,$y,$z);
}

list($a,$b,$c) = add(10,20)
$a=10
$b=20
$c=30

上面的範例就是利用陣列來傳回多個值,利用陣列的傳回值我們就必須利用 list() 函數將所傳回的值再一一的指定給其它的變數。