:::

7. PHP程式整併與樣板流程判斷

一、 關於函數

  1. 函數有兩種,一組是PHP內建函數,另一種是自訂的函數。
  2. 一個函數通常都有其獨特的功能,可視為具特定功能的小零件,直接呼叫使用即可,如:phpinfo(),有些有傳回值,有些沒有;有些需要輸入參數,有些不用。
  3. 完整函數手冊:http://www.php.net/manual/en/funcref.php
  4. 函數基本結構:傳回值 函數名稱(參數1,參數2...);
  5. 函數傳回值有:string(字串)、int(整數)、array(陣列)、object(物件)、bool(布林值)、void(無傳回值)、mixed(不一定)、new(建立物件)
  6. 練習:顯示今日日期 (找手冊)

二、 自訂函數

  1. 自訂函數的基本語法為:
    function 函數名稱($參數1='預設值' , $參數2='預設值',...){
        global $外面的變數1, $外面的變數2;
        //函數內容,任何有效的 PHP 程式碼,包括其它函數和class定義 ;
        return 傳回值;
    }

     

  2. 參數不見得要有,傳回值也不一定要有。
  3. 超級全域變數可直接在函數中使用,外面的一般變數無法進到函數中,除非做成參數或是用 global 宣告。當然,函數裡面的變數外面也無法取用,除非return出去。
    • 常見超級全域變數
      • 以「陣列」方式存在,超級全域變數可在任何地方被拿來使用(包括函數內)。
      • $_GET、$_POST、$_REQUEST:來自表單的變數。
      • $_SERVER:環境變數,$_SERVER['PHP_SELF']取得目前網址。
      • $_COOKIE:給cookie用的全域變數,cookie是存在使用者電腦的一個小檔案
      • $_SESSION:給session的全域變數,session是存在伺服器中的一個小檔案
      • $_FILES:上傳檔案時會用到的超級全域變數。
      • // 取得目前網址
        $smarty->assign('action', $_SERVER['PHP_SELF']);

         

  4. 函數可放在檔案中任何地方,放在呼叫之前或之後都沒關係。使用時,呼叫函數名稱即可。
  5. 建議建立一個function.php檔案,若同一個函數會被兩個以上的檔案呼叫時,即可把該函數放到此檔,以便讓其他檔案共用,例如可以把連線資料庫寫成函數試試。
    • function.php
      function link_db()
      {
          //實體化資料庫物件
          $mysqli = new mysqli(_DB_LOCATION, _DB_ID, _DB_PASS, _DB_NAME);
          if ($mysqli->connect_error) {
              throw new Exception('無法連上資料庫:' . $mysqli->connect_error);
          }
          $mysqli->set_charset("utf8");
          return $mysqli;
      }
    • index.php
      // 引入function.php
      require_once 'function.php';

       

三、 製作PHP頁首頁尾檔(整併PHP檔)

  1. 可以製作header.php及footer.php,把每個檔案都會引入的東西放在裡面。
  2. 可用require_once() include_once()引入。
  3. header.php頁首檔
    <?php
    //常數設定
    define('_DB_LOCATION', 'localhost');
    define('_DB_ID', 'root');
    define('_DB_PASS', '12345');
    define('_DB_NAME', 'todo');
    define('_PAGE_TITLE', '待辦清單');
    define('_PAGE_HEADER', '我的待辦清單');
    
    // 引入function.php
    require_once 'function.php';
    // 引入Smarty
    require_once 'smarty/libs/Smarty.class.php';
    // 創建Smarty物件
    $smarty = new Smarty;
    //資料庫連線
    $db = link_db();
    
    // 一維陣列
    $navbar = ['home' => "回首頁", 'post' => "發布待辦事項"];
    $smarty->assign('navbar', $navbar);
    
    // 變數
    $content = [];
    $op      = '';
    

     

  4. footer.php頁尾檔
    <?php
    $smarty->assign('title', _PAGE_TITLE);
    $smarty->assign('header', _PAGE_HEADER);
    $smarty->assign('op', $op);
    $smarty->assign('content', $content);
    // 輸出到樣板檔
    $smarty->display('index.tpl');

     

四、 製作樣板頁首頁尾檔(整併樣板檔)

  1. 可以製作header.tpl及footer.tpl,把每個樣板檔案都會引入的東西放在裡面。
  2. 可用 {include file="header.tpl"} 引入。
    • template/header.tpl
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <link rel="stylesheet" href="css/fontawesome_css/all.css">
        <script src="js/jquery-3.5.1.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
        <title>{$title}</title>
      </head>

       

    • template/index.tpl
      <html lang="zh-TW">
        <!-- 引入檔頭 -->
        {include file="header.tpl"}
      <body>

五、Smarty 中 if 的用法

  1. 基本語法:
    {if 判斷條件}
      //條件為真執行
    {elseif 判斷條件}
      //elseif 的條件為真執行
    {else}
      //條件為假時執行
    {/if}

     

  2.   index.tpl
    {if $content}
      <div class="table-responsive">
          <table class="table table-striped table-bordered table-hover table-sm">
            <thead  class="thead-dark">
              <tr>
                <th>描述</th>
                <th>到期日</th>
              </tr>
            </thead>
            <tbody>
    
                {foreach $content as $c}
                  <tr>
                    <td>{$c.directions}</td>
                    <td>{$c.end}</td>
                  </tr>
                {/foreach}
            </tbody>
          </table>
      </div>
    {else}
      <div class="jumbotron text-center">
        <a class="btn btn-info" href="index.php?op=post" role="button">新增待辦事項</a>
      </div>
    {/if}