:::

2. PHP基本語法 V.S Smarty樣板

一、PHP基本語法

  1. PHP基本寫法:
    <?php
    echo "Hello World!";
  2. 請存到網頁目錄,如:D:\xampp\htdocs\index.php

  3. PHP程式的副檔名一律為.php

  4. PHP程式碼必須放在<?php和?>的起始標記和結束標記符號中。

  5. 若是該檔案中只有純粹的PHP語法,並沒有其他的HTML語法,那麼,就不建議加上「?>」符號。

    <?php
      $title  = "待辦清單";
      $header = "我的待辦事項清單";
    ?>
    <!DOCTYPE html>
    <html lang="zh-Hant-TW">
    
    <head>
      <meta charset="UTF-8" />
      <meta http-equiv="X-UA-Compatible" content="IE=edge" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css" />
      <script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
      <link rel="stylesheet" href="/node_modules/@fortawesome/fontawesome-free/css/all.min.css" />
      <title><?php echo $title; ?></title>
    </head>
    
    <body>
      <div class="container">
        <img src="images/logo.jpg" class="rounded-circle mx-auto d-block" width="100%" height="200rem" alt="logo">
        <nav class="navbar navbar-expand-sm navbar-dark bg-primary">
          <a class="navbar-brand" href="#">
            <h1><?php echo $header; ?></h1>
          </a>
          //以下省略
  6. echo是PHP用來輸出資料的語言結構(不是函數),常用。

  7. 在PHP中,凡是資料類型是字串的都必須用引號包起來,用雙引號或單引號都可以。

  8. 每一個PHP語句後要加上「;」結尾。

  9. 開啟瀏覽器,在網址列輸入「http://localhost/index.php」或「http://127.0.0.1/index.php」。

二、註解

  1. 單行註解:單行註解以「//」或「#」開頭,後面接的文字就是註解文字,這種註解只能用在一行的文字上。
    <?php
    echo "註解可以直接寫在後面<br>";  // 這是c++風格的單行註解
    // 這是c++風格的單行註解
    echo "當然註解寫在上面也行<br>"; 
    echo "這是另一種單行註解";     #這是Unix Shell風格的單行註解

    在 VS Code 請按 Ctrl + / 即可。

  2. 多行註解:用「/*...*/」將註解文字包起來
    <?php
    /* 這是多行註解只要前後有兩
    個多行註解的符號包起來即可  */
    /* 
    這也是多行註解只要前後有兩
    個多行註解的符號包起來即可 
    */

    在 VS Code 請按 Shift + Alt + A 即可。

三、PHP資訊頁

  1. 請建立phpinfo.php
    <?php
    phpinfo();
  2. 其中「Loaded Configuration File」就是目前您的PHP所使用的設定檔所在位置及檔名。
  3. 常用設定值:
    設定項目 建議值

    date.timezone

    主機預設時區,若主機在台灣,請務必設置為「Asia/Taipei」,否則系統抓到的可能會有誤差。

    Asia/Taipei

    display_errors

    是否顯示錯誤訊息?建議開啟!!否則網站變成空白時將很難進行除錯。

    On

    file_uploads

    是否允許檔案上傳。需配合 upload_max_filesize, upload_tmp_dir, post_max_size 等設定。一般而言,上傳上限的設定,大小需求如下:memory_limit > post_max_size > upload_max_filesize

    On

    max_execution_time

    每個程序最大允許執行時間(秒),0 表示沒有限制。這個參數有助於阻止劣質程序無休止的佔用伺服器資源。

    150

    max_file_uploads

    最多只能傳幾個檔案?請視需求設定之。

    300

    max_input_time

    每個程序解析輸入資料的最大允許時間(秒)。
    -1 表示不限制。

    120

    max_input_vars

    可接收的變數數量,超過此數量,就無法完全接收表單內容。

    5000

    memory_limit

    一個程序所能夠申請到的記憶體空間 (可以使用 K 和 M 作為單位)。 這有助於防止劣質程序消耗完伺服器上的所有記憶體。如果要取消記憶體限制,則必須將其設為 -1 。

    240M

    post_max_size

    允許送出的 POST 表單大小。

    該值必須大於 upload_max_filesize 的值。
    如果啟用了記憶體限制,那麼該值應當小於 memory_limit 指令的值。

    220M

    upload_max_filesize

    允許上傳的檔案的最大尺寸。

    200M

  4. 練習:請開啟 display_errors

四、PHP變數

  1. PHP變數命名原則:以「$」為開頭,第一個字元只能是以英文(a-z或A-Z)或底線(_),數字是不能當作第一個字元的。
  2. 變數名稱是有大小寫之分的,例如$name、$Name和$NAME是完全不一樣的!
  3. 盡量使用有意義的變數名稱,$name絕對比$aaa來的好!
  4. $def_password="1234";//把1234字串指派給$def_password,其中=是「指定運算元」。
  5. PHP變數以最後指定的值為主,可以隨時重新指定其值。

五、PHP的資料型態

  1. 字串 string:一般文字,一定要有引號。
    • 雙引號: 雙引號串中的內容可以被解釋而且替換 ,變數有效,可用{}將變數和文字隔開,例如:echo "Hi {$name}!"; 就會印出「Hi 某某某!」
    • 單引號: 單引號串中的內容直接輸出內容 ,變數會失效, echo 'Hi {$name}!'; 就會秀出「Hi {$name}!」
  2. 整數 integer:整數可分正負,如100或-100,整數不需加任何引號。
  3. 浮點數 float:有內含小數點的數字,浮點數也不需要加任何引號。
  4. 布林值 boolean:即true與false,無大小寫之分
    • true:非空字串、非0數值
    • false:空字串、數字0、NULL
  5. 陣列 array(另外說明)
  6. 物件 object: 可自行定義物件成員、物件方法等。
  7. 資源 resource:通常是一些連接伺服器,或者開啟目錄、開啟檔案的傳回值。
  8. 無值 NULL:NULL不分大小寫,不須引號 。

六、PHP陣列

  1. 不含鍵值
    $userNames=array('李佳玲','吳弘凱');
  2. 含鍵值
    • 一維陣列
      // 一維陣列
      $navbar = ['home' => "回首頁", 'post' => "發布待辦事項"];
      // $navbar['home'] = "回首頁";
      // $navbar['post'] = "發布待辦事項";
    • 二維陣列
      // 二維陣列
      $content = array(
      "1" => array('directions' => "撰寫程式", 'end' => "2021/03/20"), //用逗號結尾
      "2" => array('directions' => "開會", 'end' => "2021/03/22"),
      );
      // $content[1]['directions'] = "撰寫程式";
      // $content[1]['end']        = "2021/03/20";
      // $content[2]['directions'] = "開會";
      // $content[2]['end']        = "2021/03/22";
      // print_r($content);

七、各種訊息整理

  1. Notice 訊息不會影響網站運行,只是語法不完整或不夠嚴謹,PHP給您的溫馨提示而已。

  2. Notice: Undefined index 用了未定義的索引。PHP內心OS:指定的陣列元素找不到啦!
  3. Notice: Undefined variable: 用了未定義的變數。PHP內心OS:根本沒這個變數啦!
  4. Warning訊息是警告訊息,通常會造成部份語法無法運行,但整體網站仍可呈現。

  5. Warning: Illegal string offset 'xxx' in ooo 不合法的字串。PHP內心OS:有這個空陣列,但沒有xxx。
  6. Warning: xxx() expects at least 1 parameter, 0 given 缺少參數。PHP內心OS:xxx函數至少要一個參數。
  7. Parse error 是解析錯誤訊息,通常是語法不正確,例如少了敘述句結尾分號之類的,網站會整個停擺。

  8. Parse error: syntax error, unexpected  解析錯誤,非預期的...。PHP內心OS:語法錯誤要檢查。
  9. Fatal error 嚴重錯誤,網站會整個停擺

    Fatal error: Uncaught --> Smarty: Unable to load template 'file:index.tpl' Smarty無法載入樣板PHP內心OS:說好的樣板檔呢?在templates下找不到啦!

八、套用Smarty樣板

  1. Smarty的官網在:http://www.smarty.net
  2. 用composer安裝Smarty,按 Ctrl + ` 開啟終端機,並貼上:
    composer require smarty/smarty
  3. 建立四個Smarty需要的目錄, Ctrl + ` 在開啟終端機,並貼上:
    mkdir templates
    mkdir templates_c
    mkdir configs
    mkdir cache
    • templates:放置原始樣板的目錄(一定會用到
    • templates_c:編譯後的樣板目錄(需可寫入
    • configs:設定目錄(不見得會用到)
    • cache:樣板快取目錄(需可寫入

九、Smarty基本操作

  1. 大原則:和外觀有關的東西都放到.html或.tpl中,所需要的資料全由.php提供,簡單範例, index.php 內容
    <?php
    require_once 'vendor/autoload.php';
    $smarty = new Smarty;
    $page_title= '待辦清單';
    $header = '我的待辦清單';
    $smarty->assign('page_title', $page_title);
    $smarty->assign('header', $header);
    $smarty->display('index.tpl');
  2. 樣板檔一律放至 templates 目錄中:請將 index.php 內的所有 html 語法剪下,另存到 templates/index.tpl
  3. PHP檔中最常用的就是利用 $smarty->assign('樣板標籤名稱', $變數值); 將變數送至樣板檔。
  4. templates/index.tpl 內容:
    <head>
    <title>{$page_title}</title>
    </head>
    <body>
    ~~~~~~~~~~~~~~~~~~~~~~~~~~以下省略~~~~~~~~~~~~~~~~~~~~
    <a class="navbar-brand" href="#">
    <h1>{$header}</h1>
    </a>
  5. index.php:
    <?php
    // 引入樣板引擎檔
    require_once 'vendor/autoload.php';
    // 建立Smarty物件
    $smarty = new Smarty;
    // 設定要傳到樣板的變數
    $page_title  = '待辦清單';
    $header = '我的待辦清單';
    // 將變數送到Smarty樣板檔
    $smarty->assign('page_title', $page_title);
    $smarty->assign('header', $header);
    // 呈現在哪個檔案 templates/xxx.tpl
    $smarty->display('index.tpl');

十、Smarty變數及陣列

傳送內容 PHP檔(*.php) Smarty樣板檔(*.tpl)
一般變數
$header = '我的待辦清單';
$smarty->assign('header', $header);
{$header}
一維陣列
$navbar['home'] = "回首頁";
$navbar['post'] = "發布待辦事項";
$smarty->assign('navbar', $navbar);
<li class="nav-item active">
<a class="nav-link" href="#">{$navbar.home} <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="post.html">{$navbar.post}</a>
</li>
二維陣列
$content[1]['directions'] = "撰寫程式";
$content[1]['end']        = "2021/03/20";
$content[2]['directions'] = "開會";
$content[2]['end']        = "2020/03/22";
$smarty->assign('content', $content);
{foreach $content as $c}
<tr>
<td>{$c.directions}</td>
<td>{$c.end}</td>
</tr>
{/foreach}
<tr>
<td>{$content.1.directions}</td>
<td>{$content.1.end}</td>
</tr>
<tr>
<td>{$content.2.directions}</td>
<td>{$content.2.end}</td>
</tr>

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

  1. 可以製作header.php及footer.php,把每個檔案都會引入的東西放在裡面。
  2. 可用 require_once() include_once() 引入。
  3. header.php 頁首檔
    <?php
    // 引入樣板引擎檔
    require_once 'vendor/autoload.php';
    // 建立Smarty物件
    $smarty = new Smarty;
    // 設定要傳到樣板的變數
    $page_title  = '待辦清單';
    $header = '我的待辦清單';
    // 一維陣列
    $navbar = ['home' => "回首頁", 'post' => "發布待辦事項"];
    $smarty->assign('navbar', $navbar);
  4. footer.php 頁尾檔
    <?php
    // 將變數送到Smarty樣板檔
    $smarty->assign('page_title', $page_title);
    $smarty->assign('header', $header);
    $smarty->assign('content', $content);
    // 呈現在哪個檔案 templates/xxx.tpl
    $smarty->display('index.tpl');
  5. index.php
    <?php
    // 引入頁首 header.php
    require_once 'header.php';
    // 二維陣列
    $content = array(
    "1" => array('directions' => "撰寫程式", 'end' => "2021/03/20"), //用逗號結尾
    "2" => array('directions' => "開會", 'end' => "2021/03/21"),
    );
    // 引入頁尾
    require_once 'footer.php';

十二、 製作樣板頁首檔(整併樣板檔)

  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">
      <title>{$page_title}</title>
      <link rel="stylesheet" href="\node_modules\bootstrap\dist\css\bootstrap.min.css">
      <script src="\node_modules\bootstrap\dist\js\bootstrap.bundle.min.js"></script>
      </head>
    • template/index.tpl
      <html lang="zh-Hant-TW">
      <!-- 引入檔頭 -->
      {include file="header.tpl"}
      <body>
  3. 練習引入導覽列 navbar.tpl