PHP 入門指南 - 儲存 Encrypt 物件

伺服端必須儲存 Encrypt 物件 (object) 才能作後續各種的資料處理




完整程式檔案請參考 encryptor_function.php


我們在 encryptor_function.php 中,先 include encryptor.php ,這樣才能使用 Encrypt 類別 (class)
include "encryptor.php";


然後建立一個 Encrypt 物件與檔案路徑 "code.txt"
$e = new Encrypt();
$data = "code.txt";


由於這兩個變數 (variable) 在之後很多函數 (function) 都會用到,因此先建立起來,等一下當全域變數 (global variable) 使用。檔案路徑也就是我們存檔的檔名。


我們替 New 設計的 new_button() 如下
function new_button() {
    global $e, $data;
    $f = fopen($data, "w+");
    $s = join($e->cArray, "");
    fwrite($f, $s);
    fclose($f);
 
    return "new: ".$s;
}


global 用在函數中,使後面接的變數對應到函數以外相同 PHP 檔案的變數名稱,也就是讓剛才建立的 $e 、 $data 能在 new_button() 中使用。


儲存檔案使用三個內建函數 fopen() 、 fwrite() 與 fclose() 。 fopen() 用以開啟檔案串流,第一個參數為檔案路徑,第二個參數則是開啟模式,此處為 "w+" ,也就是寫入並新增。


我們這裡只需要將 cArray 利用 join() 合成一個字串儲存就可以了。 fwrite() 用以寫入內容到檔案,第一個參數為檔案串流變數,也就是剛剛用 fopen() 建立的 $f ,第二個參數則是要寫入的字串。


檔案處理結束,要用 fclose() 關閉檔案串流。最後 new_button() 回傳訊息字串,這裡是用 "new: " 加上密碼表字串。


由於儲存的是密碼表的字串,載入時自然也是密碼表的字串,因此 Encrypt 類別需要增加一個 setcArray() 方法 (method) ,使其可以直接用密碼表字串設定 cArray 。 setcArray() 如下
public function setcArray($s) {
    for ($i = 0; $i < 26; $i++) {
        $this->cArray[$i] = $s[$i];
    }
}


完整 Encrypt 類別請參考 encryptor.php


setcArray() 的設計也很簡單,就是將字串中逐一元素各自儲存到 cArray 裡就行了。


我們另外有設計 Clean 按鈕,用來清除 Encrypt 物件,概念很簡單,就把檔案內容改成空字串就行了
function clean_button() {
    global $e, $data;
    $f = fopen($data, "w+");
    fwrite($f, "");
    fclose($f);
 
    return "Encrypt object is clean out.";
}


這樣 Load 按鈕的 load_button() 就需要比較複雜一點,如果檔案是空字串,也就是內建函數 filesize() 回傳值為 0 ,那麼就不允許載入,相反地檔案不是空字串,表示有密碼就用 fread() 讀取密碼表,然後設定到 $e 之中
function load_button() {
    global $e, $data;
    $f = fopen($data, "r");
    if (filesize($data) == 0) {
        fclose($f);
        return "load denied";
    }
    else {
        $s = fread($f, filesize($data));
        $e->setcArray($s);
        fclose($f);
  
  return "load: ".$s;
    }
}


其實 Load 的目的只有檢查是否有密碼表而已,這裡設定到 $e 之中有點是多餘的動作。


encryptor03.php 修改如下
<?php
// include
include "encryptor_function.php";

// switch
switch ($_REQUEST["op"]) {
    case "New":
        $main = input_form();
        $display = new_button();
        break;
    
    case "Load":
        $main = input_form();
        $display = load_button();
        break;
    
    case "Encode":
        $main = input_form();
        $display = "There is <b>Encode</b> button. Your input is '{$_POST['input']}'.";
        break;
    
    case "Decode":
        $main = input_form();
        $display = "There is <b>Decode</b> button. Your input is '{$_POST['input']}'.";
        break;
    
    case "Clean":
        $main = input_form();
        $display = clean_button();
        break;
    
    case "record":
        $main = "This is record page..";
        $display = "This is record page..";
        break;
    
    case "about":
        $main = "This is about page..";
        $display = "This is about page..";
        break;
    
    default:
        $main = input_form();
        $display = "something happened";    
}

// make page
echo make_page($main, $display);

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:encryptor04.php
    功能:示範 PHP 程式 
    作者:張凱慶
    時間:西元 2012 年 11 月 */
?>


結果如下



好了,接下來我們要整合編碼、解碼功能囉!


中英文術語對照
物件object
類別class
函數function
全域變數global variable
方法method


您可以繼續參考
網站篇


相關目錄
回 PHP 入門指南
回 PHP 教材
回首頁


參考資料
http://www.php.net/manual/en/tutorial.firstpage.php
http://www.php.net/manual/en/tutorial.useful.php
http://www.php.net/manual/en/functions.user-defined.php
http://www.php.net/manual/en/functions.arguments.php
http://www.php.net/manual/en/functions.returning-values.php

沒有留言: