1 / 104

PHP 函式

PHP 函式. 使用函式的優點. 提高程式可讀性 將程式模組化,讓程式碼可重複使用,提升寫程式的效率 提高除錯效率 將特定功能獨立為函式後,如果需要修改該功能 , 只要更動函式即可,不用更改主程式,可提升程式修改的容易度。. 自訂函式. 定義函式的基本語法如下: function 函式名稱 ($arg_1, $arg2, …){ 程式敘述 … return 回傳值 ; } 函式名稱的命名規則與變數相同, 不可與其他函數或變數同名。

gwidon
Download Presentation

PHP 函式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PHP 函式

  2. 使用函式的優點 提高程式可讀性 將程式模組化,讓程式碼可重複使用,提升寫程式的效率 提高除錯效率 將特定功能獨立為函式後,如果需要修改該功能, 只要更動函式即可,不用更改主程式,可提升程式修改的容易度。

  3. 自訂函式 • 定義函式的基本語法如下: function 函式名稱($arg_1, $arg2, …){ 程式敘述 … return 回傳值; } • 函式名稱的命名規則與變數相同,不可與其他函數或變數同名。 • $arg_1、$arg_2... 代表要傳入函式的參數。函式的參數可有可無, 視程式設計上的需要而定。 • return 會將回傳值傳回給呼叫者。回傳值可以是任何型別, 例如字串、數字、變數、陣列、物件等。 • 如果函式不需要回傳值, 則可以省略 return 敘述。

  4. 自訂函式 • 範例一: function hello(){ return “Hello World!”; } • 範例二: function sum($num1, $num2){ return $num1+$num2; }

  5. 自訂函式的參數預設值 • 自訂函式時, 可以先設定參數的預設值, 以避免呼叫時沒有給予參數而產生錯誤: function sum($num1=0, $num2=0){ //num1, num2 預設值為0 return $num1+$num2; } sum(); //回傳0 sum(5);//回傳5 sum(NULL, 3);//回傳3 sum(5, 3);//回傳8

  6. 傳值呼叫(call by value) • 函式傳遞參數的預設方法 • 只將變數值複製給函式的參數。 • 在記憶體中卻是不同的變數 • 即使兩者名稱相同,也是不同的變數 • 範例: function square($x){ $x = $x * $x; echo ‘函式內的$x = ‘ . $x; } $x = 3; squre($x); echo ‘函式外的$x = ‘ . $x; • 結果: 函式內的$x = 9 函式外的$x = 3

  7. 傳址呼叫(call by address) • 將變數實體傳遞給函式,在記憶體中是相同的變數 • 定義函式時,在參數前面加上 & 符號 • 即使兩者名稱不同,也是相同的變數 • 範例: function square(&$x){ $x = $x * $x; echo ‘函式內的$x = ‘ . $x; } $x = 3; squre($x); echo ‘函式外的$x = ‘ . $x; • 結果: 函式內的$x = 9 函式外的$x = 9

  8. 引用 • 目的: • 共同函式、變數定義等可以給多個檔案共用。 • 方便未來維護時的修改。 • 使用方法: • include filename; //引用失敗,後面程式碼仍會繼續執行 • include_oncefilename; //引用失敗,後面程式碼仍會繼續執行,避免重覆引用 • require filename; //引用失敗,後面程式碼不會繼續執行 • require_oncefilename; //引用失敗,後面程式碼不會繼續執行 ,避免重覆引用

  9. 引用示意圖

  10. PHP 常用函式庫

  11. 分割字串 - explode() • 將字串依分字元進行分割,並將結果以字串陣列傳回 • explode(delimiter, string) • delimiter: 分割字元 • string: 被分割的字串 • 範例:生日為 “71 / 12 / 03”,如果想各別取出年、月、日,便需要將這個字串進行分割。

  12. 依規則比對字串 - ereg() • ereg(pattern, string) • pattern: 用來比對的規則 • string: 被比對的字串 • 若不符合回傳 FALSE,若相符,傳回符合的長度 • 範例:檢查電話與身份證字號

  13. 依規則比對字串 - ereg() • 程式碼如下: //假設電話號碼格式: 2個數字+‘-’符號+ 8個數字 If( ! ereg(‘[0-9]{2}-[0-9]{8}’, $tel_no) ) echo ‘電話號碼格式錯誤’; //假設身分證字號格式:1個A-Z字母+ 1個1-2數字+ 8個數字 If( ! ereg(‘[A-Za-z]{1}[1-2]{1}[0-9]{8}’, $id) ) echo ‘身分證字號格式錯誤’; • [0-9]{2} 表示2個 0 - 9 之間的數字 • [0-9]{8}表示8個 0 - 9 之間的數字。 • [A-Za-z]{1}表示 1 個 A - Z 或 a - z 之間的英文字母。 • 也可以用eregi(‘[A-Za-z]{1}[1-2]{1}[0-9]{8}’, $id)

  14. 依規則比對字串 - ereg() 執行結果:

  15. 取代字串的內容 • PHP 提供了許多不同的函式可以用來取代字串的內容, 其中較常用的為 str_replace()、ereg_replace()。 • str_replace() 函式

  16. 取代字串的內容 • str_replace() 會在 string 中搜尋 search 的內容, 如果找到的話, 就會代換為 replace 的內容, 然後傳回一個新字串, 範例如下: • 上例中, str_replace() 會將『社』取代為『公司』, 然後傳回『旗標出版公司』給 $string 變數。 • str_replace() 常見的用途是將字串中的特殊字元代換為 HTML 符號, 以使其能夠正確顯示於網頁。

  17. 取代字串的內容 • 例如網頁中的連續空白必須使用 " " 才能正確顯示, 否則不論有多少個連續空白字元, 瀏覽器都會將其當成一個空白。 • 所以下面程式為了正確顯示連續空白, 就必須使用 str_replace() 將空白取代為 " ":

  18. 取代字串的內容 • 執行結果: • 網頁的原始碼如下頁所示。

  19. 取代字串的內容 • 代換空白時, 一般較直覺的想法是將每個空白代換為 " ":

  20. 取代字串的內容 • 進行這樣的代換時, 如果字串中包含 HTML 標籤, 因為 HTML 標籤中經常會有空白, 例如 <a href>, 所以若使用 str_replace() 取代每個空白, 便會破壞 HTML 標籤。 • 所以程式的 (A) 處是將 2 個連續空白字元代換為 "&nbsp;&nbsp;", 這是因為單一的空白字元可以顯示於瀏覽器, 只需要處理連續 2 個以上的空白。

  21. 取代字串的內容 • 下表列出各種狀況下, 代換兩個連續空白的結果 (一個 * 表示一個空白):

  22. 取代字串的內容 • ereg_replace() 函式 • ereg_replace() 會使用規則運算式取代字串的內容, 其語法如下: • ereg_replace() 會使用規則運算式比對 string 的內容, 如果找到符合規則運算式的內容, 就會將其以 replace 取代, 然後傳回新的字串。

  23. 取代字串的內容 • 若找不到符合規則運算式的內容, 則傳回原本的字串。 • 如下例會將所有英文字母 a - z 取代為空字串, 亦即刪除所有 a - z 英文字母: • 因為 ereg_replace() 使用規則運算式比對內容, 所以可以進行比較複雜的字串取代, 不像前面 str_replace() 只能單純地取代固定內容。 • 但是相對的, ereg_replace() 的速度比 str_replace() 慢, 所以如果只需要取代固定內容, 建議使用 str_replace() 即可。

  24. 傳回格式化字串 – sprintf() • sprintf(foramat_string, arg_1, arg_2, …) • format_string:包含參數的格式化字串 • arg_1, arg_2:各參數值 • 類似Java的format(),C++的sprintf() • %d:整數 • %f:浮點數 • %s:字串

  25. 清除多餘空白 - trim() • trim(string) • string:欲處理的字串 • 可以清餘字串開頭與結尾的空白、換行、NULL...等看不見的特殊字元。 • ltrim()與rtrim():分別清除字串左、右的多餘空白

  26. 5 - 5 表單文字處理 • 前面 4-6 節介紹過如何以 $_POST 或 $_GET 陣列取得使用者輸入的文字。 • 取得了資料之後, 在許多狀況下都需要處理後才能安全、正常使用, 本節將會探討各狀況下應該如何處理使用者輸入的文字。 • 表單文字中, 有兩大類必須特別注意並且加以處理, 以下將分別為您說明: • HTML 特殊字元 • 括號與反斜線

  27. HTML 特殊字元 在 HTML 網頁中, 如果要顯示下面字元, 應該使用 HTML 符號來表示:

  28. HTML 特殊字元 上表中, < 與 > 是用來定義 HTML 標籤的字元, 所以如果要顯示這兩個字元, 必須以 HTML 符號來表示。 & 則是 HTML 符號的前置字元, 具有特殊的意義, 因此也必須藉由 HTML 符號來表示。 而 ' 與 " 則是 PHP 定義字串的括號, 所以部分程式設計者為了避免影響程式, 也會以 HTML 符號來顯示括號。 至於連續空白與換行字元, 都需要使用 HTML 符號與標籤才能正常顯示。

  29. 不代換 < 與 > 字元的危險性 將 < 與 > 代換為 HTML 符號的目的, 除了要讓這兩個字元正常顯示以外, 另一方面也可以避免使用者故意輸入 HTML 語法。 例如下面程式會顯示使用者輸入的姓名:

  30. 不代換 < 與 > 字元的危險性 因為程式沒有特別處理 < 與 > 字元, 所以使用者可以特意輸入 HTML 標籤:

  31. 不代換 < 與 > 字元的危險性 如果使用者輸入了惡意的語法, 便會讓原本正常的程式輸出帶有破壞性的網頁。 例如下面是一段惡意的 Java Script 程式, 只要滑鼠經過該連結時, 就會導致瀏覽器開啟無數個視窗, 更甚者可能會耗盡系統資源後當機:

  32. 不代換 < 與 > 字元的危險性 如果上述程式是一個留言板或論壇程式, 其他使用者瀏覽時便可能執行到該惡意程式, 所以您的網站就會因為使用者輸入的字串, 而變成一個帶有惡意程式的網站。

  33. HTML 特殊字元的建議處理方式 一般網頁程式接收表單文字後, 可能會有以下步驟:

  34. HTML 特殊字元的建議處理方式 若在圖中的狀況 A 就處理 HTML 特殊字元, 那麼存入資料庫的留言就會包含 "&nbsp;" 或 "<br/>" 等 HTML 符號或標籤。 如此一來, 雖然顯示資料時可以正確表示空白與換行, 但是編輯資料時, 在狀況 C 必須進行相反的取代, 否則編輯者就會看到 "&nbsp;" 與 "<br/>", 而不是空白與換行。 當編輯完畢後, 狀況 D 還需要再次進行取代工作, 所以 4 種狀況中有 3 種需要進行額外的處理。

  35. HTML 特殊字元的建議處理方式 其實只要反過來思考, 改為在狀況 B 進行取代, 其他狀況 A、C、D 都不進行處理, 即可避免產生上面麻煩的問題。 所以建議您, 只有在顯示時, 才處理 HTML 特殊字元, 其他狀況時則不多加處理。 前述應代換為 HTML 符號的字元中, 除了連續空白必須使用 str_replace() 自行代換外, 其他 PHP 皆提供相關的處理函式, 不需自行撰寫程式, 隨後將分別介紹這些函式。

  36. HTML 特殊字元的建議處理方式 • 處理換行字元 - nl2br() 函式 • nl2br() 函式是用來將換行字元取代為 <br/> 標籤, 其語法如下: • nl2br() 函式將字串中所有的換行字元取代為 <br/> 標籤之後, 會以字串傳回。 • 下面以範例示範 nl2br() 的使用方法。

  37. HTML 特殊字元的建議處理方式 • 執行結果:

  38. HTML 特殊字元的建議處理方式 • 處理 HTML 特殊字元 - htmlspecialchars() 函式 • htmlspecialchars() 函式可以將 &、'、"、<、> 等字元取代為相對應的 HTML 符號, 下面是其基本語法:

  39. HTML 特殊字元的建議處理方式 • htmlspecialchars() 函式會依照 5-25 頁對照表, 將 &、<、> 字元代換為 HTML 原始碼。 • 至於 '、" 字元是否取代為 HTML 符號, 則取決於後面 quote_style 參數的設定。 • quote_style 有 3 種參數: • ENT_COMPAT:只取代 ", 不取代 '。 • ENT_QUOTES:" 與 ' 皆取代。 • ENT_NOQUOTES:" 與 ' 兩個皆不取代。

  40. 括號與反斜線 • 在 PHP 中, 括號 " 與 ' 和反斜線 \ 都具有特殊的意義, 所以若使用者剛好需要輸入特殊字元, 例如輸入『It's a cat』, 字串中的 ' 符號便有可能會造成程式錯誤。 • 甚至如果遇到惡意者, 更可能藉由輸入這些特殊字元, 影響程式的邏輯, 入侵取得想要的資料。 • 括號與反斜線的處理

  41. 括號與反斜線 • 表單文字中如果包含括號或反斜線, 一般會在程式中特別處理, 將其再加上一個反斜線, 以取消其特殊意義: • magic_quotes_gpc 設定 • 在 php.ini 的設定中有一個項目為 magic_quotes_gpc, 這個設定值預設為開啟的狀態。

  42. 括號與反斜線 • 開啟時若表單文字包含 ' 、 " 、\ 等特殊字元, PHP 接收後會自動加上反斜線『\』, 取消其意義, 避免這些特殊字元影響 PHP 程式的執行。 • 所以如果開啟 magic_quotes_gpc 設定, 程式中便不需自行處理表單文字的括號與反斜線, PHP 會自動為我們加上反斜線。 • 如果您需要在程式中知道目前 magic_quotes_gpc 是否開啟, 可以使用 get_magic_quotes_gpc() 函式。

  43. 括號與反斜線 • get_magic_quotes_gpc() 函式使用時不需參數, 若傳回整數 1, 則表示 magic_quotes_gpc 已經開啟, 若傳回整數 0, 則未開啟 magic_quotes_gpc: • 自行處理括號與反斜線 - addslashes() 與 stripslashes()

  44. 括號與反斜線 • 除了使用 magic_quotes_gpc 功能自動處理括號與反斜線外, PHP 也提供了兩個處理括號與反斜線的函式 - addslashes() 與 stripslashes(), 可以讓我們自行處理括號與反斜線, 其語法如下: • addslashes() 會在字串中的 \、'、" 等字元前面再加上一個 \, 讓反斜線與括號不再具備特殊意義;而相反的, stripslashes 則會將字串中所有反斜線刪除。

  45. 括號與反斜線 • 這兩個函式會將處理後的資料以字串傳回, 範例如下: • 括號與反斜線的建議處理方式 • magic_quotes_gpc 功能雖然方便, 但是建議您撰寫程式時, 最好不要只依靠 magic_quotes_gpc 的功能。

  46. 括號與反斜線 • 否則若遇到系統管理者設定錯誤, 或是執行程式的系統原本就關閉 magic_quotes_gpc, 此時您的程式將立刻變得不安全。 • 因為 magic_quotes_gpc 有可能是開啟, 也有可能是關閉, 而且此功能無法於程式執行時更改設定。 • 所以為了保險與統一起見, 筆者建議程式中一律視 magic_quotes_gpc 已經關閉, 然後在執行有可能被括號與反斜線影響的動作 (例如寫入資料庫) 前, 手動加上反斜線。

  47. 括號與反斜線 • 下面是建議的括號與反斜線處理流程圖:

  48. 總結表單文字的處理方式 • 本節將綜合以上所述, 歸納出一個表單文字的處理原則。 • 對於同時具備輸入、顯示、儲存、編輯的大型程式, 嚴格採用這些的原則可以在程式撰寫時有所依據, 比較不會發生混亂或出錯的問題。 • 接收表單文字 • 接收表單文字時, 先刪除 magic_quotes_gpc 功能可能加上的反斜線, 盡可能地保持資料的原貌。

  49. 總結表單文字的處理方式 • 寫入資料庫 • 如果要將表單文字寫入資料庫, 先使用 mysql_real_escape_string() 函式處理反斜線與括號。

  50. 總結表單文字的處理方式 • 如果您使用 PEAR 的 MDB2 類別存取資料庫, 應先使用 quote() 方法處理反斜線與括號。 • 顯示在網頁上 • 要將表單文字, 或是從資料庫 / 檔案取出的文字顯示在網頁上時, 應先代換 HTML 特殊字元。

More Related