溫瑞烘老師的教學歷程檔案(Teaching ePortfolio) - 102-1--物件導向程式設計 - 第4週講義-PHP函數
 

資訊管理系
副教授
温瑞烘


歷程檔案 Portfolio


關於我 About Me

第4週講義-PHP函數

PHP函數

 

本文引自http://pydoing.blogspot.tw/2012/10/php-tutorial.html

http://www.jollen.org/php/ebook/ch9.html

 

函數 (function) 是一種功能性的模組,可以將程式 (program) 分割成小部分,藉由呼叫函數安排執行順序。

定義函數使用關鍵字 (keyword) function ,其後空一格接函數名稱,函數名稱後緊接小括弧,小括弧中為參數列 (parameter list) ,函數可以有參數 (parameter) 也可以沒有參數,同樣可以有回傳值 (return value) 也可以沒有回傳值,端視需要而定。如何定義 function

PHP 的函數定義是利用 function 關鍵字,語法:

function func_name(傳入參數1, 傳入參數2, ...) {

...

    程式區

...

}

 

函數可以讓我們的程式更具可讀性,也符合模組化程式設計的原則。底下是一個定義函數的範例:

function IsAlpha($x) { // 字母回傳True否則回傳False

if ($x >= 'a' && $x <= 'z') return TRUE;

if ($x >= 'A' && $x <= 'Z') return TRUE;

return FALSE;

}

這個函數傳入一個參數,如果是26個字母之一,會傳回TRUE、否則傳回FALSE。再看下一個例子

function big($a, $b) {    

if ($a > $b) {        

return $a;    

}    

else {        

return $b;     

}

}

 

big() 函數回傳兩個參數中的較大值,參數數量則是依需求自己定義,這裡為兩個 $a $b ,另外此例用了兩個 return ,有回傳值的函數至少要有一個 return return 就是函數結束執行,將控制權交還原本呼叫函數的地方。

 

範例程式一

<?php

  echo big(33, 22)." is bigger! <br>";

  echo big("John", "Mary")." is bigger! <br>";


 
function big($a, $b) {    

    if ($a > $b) {        

      return $a;    

    }    

    else {        

      return $b;    

    }

  }

?>

 

 2 行先比較 33 22 的大小,然後印出哪一個比較大。第 3行則是比較 "John" "Mary" 的大小,字串比較是先比較第一個字元,按字母順序,順序越後面的值越大

 

參數傳遞與傳回值

PHP 支援 call by value call by reference 兩種傳遞參數的方法,並且在函數執行結束後,可以利用 return 傳回一個值給父程式。

call by valuecall by value 是父程式直接將值或變數傳給函數,因此該數值或變數被儲存於兩個不同的記憶體位置。當傳入一個變數時,在函數裡改變傳入的參數值對父程式的變數並不會造成影嚮。

範例:

 

$x = 25;

$y = 10;

echo sum($x, $y);        // 輸出 35;

echo $x;                 // 輸出 25

 

function sum($x, $y) {

  $x += $y;

  return $x;

}

 

因為參數的傳遞使用 call by value 的方式,因此父程式的 $x sum() 函數的 $x 變數不會互相影嚮。這是因為這二個變數是分別位於兩個不同的記憶體位置的關係。

 

call by referencecall by reference 是一種非常好用的機制,利用 call by reference 傳入一個變數參考時,等於是將指向該變數的指標傳給函數,在函數裡改變該參考等於改變原來的變數值,因此可以達到改變原來變數值的效果。利用 call by reference 傳遞傳數時,傳入的變數與函數裡的參數變數位於相同的記憶體位置。在 PHP 程式裡如果要傳遞參考 (call by reference) 的話,有二種做法,我們可選擇適合我們使用的方法:

1. 呼叫函數時在變數前加上 &,例如:

add(&$x, $y);

此時 add() 的寫法沒有什麼不同:

function add($x, $y) {

  $x = $x + $y;

}

2. 在函數的參數加上 &,例如:

function add(&$x, $y) {

  $x = $x + $y;

}

此時呼叫函數的寫法:

add($x, $y);

 

二種寫法實際上是有所不同的。第一種寫法是呼叫函數時在變數前加上 &,這種寫法可以讓我們在呼叫函數時才決定是否要採用 call by reference 的方式傳遞參數。而第二種寫法是在函數的傳入值前加上 &,這種寫法會強迫使用 call by reference 的方式傳遞參數,而不管呼叫函數時是採取 call by value 或是 call by reference 的方式。善用二種方式間的差異可以幫助我們維護程式的品質。例如,當我們的函數必須替父程式維護傳入變數值時,這時就可以強迫函數的傳入值採取 call by reference 的方式,如此就算我們呼叫函數時手誤少打了一個 "&",也可以正確採取 call by reference 的方式。

 

在前面的範例中,我們直接以 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程式, 使用一個函數完成下列所有操作

假設 $a=100; $b=20; 計算下列範例的內容,以echo 輸出

<?php
  $a=100;
  $b=200;
  $c=myfunction($a,$b,"+");
  echo "$a + $b = $c <br>";

  function myfunction($a,$b,$op) {
    switch($op) {
      case "+": return ($a + $b); break;
    }
  }
?>

 

 
運算子
功能
範例
+
$a + $b
-
$a - $b
*
$a * $b
/
$a / $b
%
取餘數
$a % $b
2. 假設 $a=100; $b=20; 計算下列範例的內容,以echo 輸出
運算子
功能
範例
==
相等
$a == $b
!=
不相等
$a != $b
大於
$a >= $b
>=
大於等於
$a >= $b
小於
$a < $b
<=
小於等於
$a <= $b
3. 假設 $a=100; $b=20; 計算下列範例的內容,以echo 輸出
運算子
功能
範例
=
指派
$a = $b
+=
相加同時指派
$a += $b ($a = $a + $b)
-=
相減同時指派
$a -= $b ($a = $a - $b)
*=
相乘同時指派
$a *= $b ($a = $a * $b)
/=
相除同時指派
$a /= $b ($a = $a / $b)
%=
取餘數同時指派
$a %= $b ($a = $a % $b)



練習二

寫一PHP程式使用函數sum_for($a,$b,$c), sum_while($a,$b,$c), sum_do_while($a,$b,$c)
分別計算 1+2+..+100 2+4+..+100, 1+3+..+99,
例如 $sum=sum_for(1,100,1);

function sum_for($a,$b,$c) {
  $sum=0;
  for ($i=$a; $i<=$b; $i=$i+$c) {
    $sum=$sum+$i;
  }
  return $sum;
}






 

全部共 0則留言
登入帳號密碼代表遵守學術網路規範
 


文章分類 Labels

 


最新文章 Top10

中華科技大學數位化學習歷程 - 意見反應