iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 20
0
Modern Web

網頁程式設計so easy系列 第 20

Day19 [PHP-3]

  • 分享至 

  • twitterImage
  •  

PHP自訂函數

  • 無傳入值之函數
function sayHello(){
    print "<h2>Hello world.</h2>";
}

之後在php程式碼區塊輸入sayHello();就會印出 Hello world.

  • 有傳入值之函數
function add($a, $b){
	return $a + $b;
}

$c = add(1,3); //$c = 4

  • 傳址函數
function addByVal($c){
    $c = $c + 2;
    print $c;
}
function addByRef(&$c){
    $c = $c + 2;
    print $c;
}

$c = 1; // 變數初值
addByVal($c); //3
print $c; //1
addByRef($c); //3
print $c; //3
可參考之前介紹變數之段落

  • 預設參數值
function add($a, $b, $c=0, $d=0){
    return $a + $b + $c + $d;
}

此函數有兩個必須傳入之參數,如果呼叫時後面的第三個第四個參數沒有指定引述值就會使用預設參數值。
add(1); //wrong!!!
add(1,2); //3
add(1,2,3); //6
add(1,2,3,4); //10

注意:預設值參數一定要為在函數參數列的最後

  • 函數變數
    呼叫變數值的函數,只需要在變數後加上括號傳入參數,就可以呼叫變數值的函數。
    延續上面的函數
    $func = "add";
    print $func(3,4,5); //12

引入檔案

  • require()
  • include()

以上兩個功能及使用方式都很相似,只是require()引入檔一定需要存在,否則會產生執行錯誤;include()引入檔如果不存在只會顯示警告訊息,程式一樣可以繼續執行。實作上,會將PHP函數抽出成函數庫檔案,通常副檔名為.inc。
include(XXXX.inc);

內建函數

  • 日期/時間
$stamps = time();  //會是一大串數字(從1970/1/1到指定日期/時間的秒數)_Timestamps
//$date = date("l F j Y h:i:s A", time());  //Tuesday December 20 2016 11:33:52 AM
$today = getdate($stamps); 
$month = $today["month"];  //December  ($today["mon"]  //12)
$day = $today["mday"];   //20
$year = $today["year"];   //2016
//$today["weekday"]  //星期幾(英文全名)
//$today["hours"]
//$today["minutes"]
//$today["seconds"]

strtotime("+4 months +5 days",$today); //April/25/2017 11:33:52
  • 資料型態
    • 檢查資料型態
      empty($var), is_null($var), is_bool($var), is_string($var), is_int($var), ...
    • 取得資料型態
      gettype($var)
    • 指定變數資料型態
      settype($var, string type)

錯誤

錯誤處理在寫程式是非常重要的一個環節,試想今天使用一個系統,莫名其妙地跳出密密麻麻的錯誤訊息,是一件很惱人的事情。在我前公司寫程式時,這甚至是新人報告中要特別報告的一個環節,所以就算自己在家裡寫程式不用處裡錯誤訊息,但未來就業,這是一個重要的課題。

  • 環境錯誤
    程式執行環境導致的錯誤,而不是程式設計問題。(沒有權限、檔案不存在...)

  • 程式錯誤
    程式中有bug,可能為語法錯誤、語意錯誤或程式邏輯錯誤。

  • 錯誤處理

    • 錯誤等級
    1. Notice: 非致命的錯誤,例如:沒有初始變數值...
    2. Warning: 尚能補救和非致命的執行時錯誤,PHP引擎會試圖繼續執行。例如:查無檔案
    3. Fatal Errors: 執行時的錯誤,會導致PHP程式終止執行。
    4. Parse Errors: PHP程式碼的語法和語意錯誤,這是在執行前直譯過程找出的錯誤。
    • 自訂PHP的錯誤處理函數
$fp = @fopen($file, "r") //以唯讀方式開啟file
        or exit("錯誤:檔案 $file 開啟錯誤!<br/>");

如果檔案開啟成功,因為or運算的第一個運算元已經為true,運算結果為true,就不用處理第二個運算元,所以不會處理exit()。但當檔案開啟錯誤,就會執行exit()顯示參數字串和中止PHP程式執行。將exit()改為die() 會有一樣效果。
之所以不會顯示PHP內建錯誤處理的錯誤訊息是因為有使用錯誤處理運算子「@」。

其實這就像java的

try{
       開檔案
   }catch(錯誤){
       顯示錯誤訊息or do nothing
   }

PHP有提供error_reporting()函數指定PHP程式需要回報的錯誤等級。

// 設定報告等級
error_reporting(E_ERROR | E_WARNING | E_NOTICE);
// 自訂的錯誤處理函數
function myErrorHandler($type,$msg,$file,$line) {
   switch( $type ) {
      case E_ERROR: echo "<b>致命錯誤:</b><br/>";
         break;
      case E_WARNING: echo "<b>警告錯誤:</b><br/>";
         break;
      case E_NOTICE: echo "<b>注意錯誤</b><br/>";
         break;
   }
   $err = "第: $line 行<br/>"; // 建立錯誤訊息
   $err .= "錯誤訊息: <b>$msg</b> <br/>";
   echo $err;                         // 顯示錯誤訊息
   error_log($err, 3, "errors.log");  // 寫入記錄檔案
   if ( $type == E_ERROR ) {
      echo "<font color=red>終止程式執行</font>";
      die();  // 終止程式執行
   }
}
set_error_handler('myErrorHandler'); // 指定錯誤處理函數

執行:

$var++;       // 產生注意錯誤
$x = 0;  $y = 10;
$c = $y / $x; // 產生警告錯誤

結果:
http://ithelp.ithome.com.tw/upload/images/20161220/20103385cGvdBSNfsU.png

  • 產生使用者自訂錯誤
    trigger_error("錯誤訊息", E_USER_ERROR);
    用法跟上面的一樣,當case E_USER_ERROR可自訂錯誤訊息。

更多PHP語法訊息可以參考更多教學網站,本系列不完整介紹。


上一篇
Day18 [PHP-2]
下一篇
Day20 [PHP狀態管理]
系列文
網頁程式設計so easy30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言