php學習之留言板

前言

在對php語法有必定了解以後開始,這是第一個php練手項目,涵蓋的知識有php

  • 公共部分的引用css

  • 表單的提交html

  • 請求的接收與響應前端

  • interface+implements的使用git

  • 基於文件的所處理的增刪改查es6

  • json的格式化與字符串序列化github

  • 項目地址message board
    ps:本文不詳細介紹知識點,只是大概描述下心得,閱讀者若是有心閱讀能夠參看相關代碼學習,因爲本人前端出身,對前端相關姿式也只是一筆帶過,可是會給出相應關鍵字或連接;ajax

總體結構的介紹

root
    │  addMess.php
    │  delMess.php
    │  index.php
    │  show.php
    │      
    ├─commom_view
    │      head.html
    │      
    ├─common
    │      lyfile.php
    │      
    ├─css
    │      bootstrap.min.css
    │      
    └─data
            liuyan.txt

php相關求情直接放在根目錄下,commom_view存放視圖相同部分,引入了bs的樣式文件存放在css中,數據txt文件存放在data文件夾下,common文件夾下存放data的liuyan.txt文件夾讀取相關方法;json

編寫過程

公共部分

1. 首先編寫公共頭部包含標題,相關功能頁面連接,爲了讓總體頁面好看一點引入了[bs3](http://www.bootcss.com/),而後在各個頁面經過```include (filepath)```的方式進行引入操做;

2. 對總體瞭解,lyfile須要實現的功能有:新增、刪除、展示,先寫接口方法addItem、delItem、getAll;

3. 編寫類LyFile實現接口中定義的三個方法(未真正編寫代碼)在須要引入的頁面一樣經過 include 的方式進行引入。

首頁

1. 首頁就是一張表單,用作相關信息的提交;

新增完成頁面

1. 表單提交後跳轉到addMess頁面,作的主要是提交信息的存儲以及,當前所提交信息的展現;

2. 用到addItem方法進行數據添加,具體請看[lyfile的編寫](#lyfile);

3. 頁面相關姿式有:post請求參數的獲取:```$_POST[varitename]```,登陸人IP獲取:```$_SERVER['REMOTE_ADDR']```、日期格式化:```date( string $format [, int $timestamp ] )```、數組鍵值對初始化方式:```array(key=>value)```、字符串拼接:"....{$varita}..."回車換行符不會打斷總體字符串只以《"》爲標識;

留言展現頁面

1. 查看留言要作的是從數據文件拿到相應的數據,而後經過循環進行渲染

2. 用到getAll()對數據進行提取,具體請看[lyfile的編寫](#lyfile);

3. 頁面相關姿式有:foreach數組循環便利、break跳出數組循環

刪除留言

1. 在展現頁上,我們對留言進行刪除,這裏沒有直接採用href跳鏈的經過get請求的形式進行,由於這裏須要作的只是刪除某條數據而後刷新列表的局部操做,不適合跳轉連接。

2. 用到delMess()對數據進行刪除,具體請看[lyfile的編寫](#lyfile);

3. 相關姿式有:$.ajax發送請求、es6字符串模板、頁面元素內容賦值、php請求返回echo xxx;

..到這,總體結構就完成了。bootstrap

<span id="lyfile">lyfile的編寫</span>

lyfile是我花的時間比較多的一塊,所以單獨拉出來說,前三段主要說我的對本身書寫方式的必要性;

interface的必要性

* 鍛鍊對項目所須要功能的總體把握能力;

* 實現者能夠經過interface的描述對功能進行逐個實現,不受其餘干擾;

* 調用者能夠經過interface相關介紹,瞭解接口調用方式;

* interface雖然能夠繼承,但他不是類。

使用類的必要性

* 提升複用性,自身調用相關參數採用$this->xxx進行調用,調用者經過實例化相關類,調用相關方法;

* 安全性,只有提供相關接口的方法才能進行調用,不然不能調用;

* 延展性,當須要添加新的接口時,之須要在內部再進行新增相應方法便可,不受其餘接口影響;

內部變量

* file_path 由於全部的文件都存儲在liuyan.txt文件上,所以file_path就保存該文件的路徑

* 常量 ERRORCODE、SUCCCODE靜態標識錯誤和正確狀態,避免再代碼中使用-1,0標識,提升代碼可讀性

addItem

* 首先了解其要作的事:一、獲取數據,二、添加相應的id(爲啥這麼幹將在delItem進行說明),三、再lyfile.txt寫入;

* 新增數據獲取是經過調用處傳過來的,在此不進行贅述;

* 添加id:這裏採用獲取最後一條留言的id值(不是索引值),在其基礎上+1以此來保持id的惟一性,具體功過代碼來講明;

* 一條數據放在一行的形式進行存儲;
public function addItem($write_data){
        //1.獲取最後一行數據的id並+1
        $lastId = $this->getLastId();
        $write_data["id"] = $lastId+1;
        //在文件末尾寫入的方式打開文件
        $handle   = fopen($this->file_path,"a");
        //數組轉字符串
        $ly = $this->itemString($write_data);
        //字符串寫入
        $str  = fwrite($handle,$ly);
        //關閉文件
        fclose($handle);
    }
    //獲取最後一行的id
    private function getLastId(){
        //獲取全部文件內容
        $lyData = $this->getAll();
        //計算行數
        $lyLen = count($lyData);
        //當沒有數據時,返回位置-1;
        if($lyLen == 0)return -1;
        //不然返回相應的id;
        return $lyData[$lyLen-1]['id'];
    }
    //獲取全部文件的內容
    public function getAll(){
        //逐行讀取文件,以數組的形式返回,每一項爲item字符串;
        $all_item = file($this->file_path);
        //聲明返回的變量數組
        $dataArr = array();
        //便利讀組的文件字符數組
        foreach($all_item as $item){
            //將字符串轉化成數組的形式(注意json_decode第二個參數,不加則返回的是一個對象),並加入到返回的變量數組中。
            array_push($dataArr,json_decode($item,true));
        }
        return $dataArr;
    }
    //數組轉化成字符串並加入換行符,這裏不作贅述
    private function itemString($item_data){
        $item_str = json_encode($item_data);
        $item_str .="\r\n";
        return $item_str;
    }

getAll

機智的同窗早已發現,在上面已經實現了這個函數,那麼我們就能夠愉快的拿起來用了,不用再重複寫了。

delItem

這要乾的就是一、經過id找到相應的項,二、找到就刪除並返回成功碼,不然返回錯誤碼

public function delItem($id){
        //獲取全部的數據
        $allLy = $this->getAll();
        //初始化要刪除的索引
        $delIndex = -1;
        
        //找到須要刪除的ID所對應的對象
        foreach($allLy as $curIndex =>$lyItem){
            //若是找到相應的id就對$delIndex進行賦值
            if($lyItem["id"] == $id){
                $delIndex = $curIndex;
                break;
            } 
        }
        
        //若是沒找到索引號,直接退出並返回錯誤碼(對象內常量的引用是self ::CONSTVAR)
        if($delIndex==-1)return self ::ERRORCODE;
        //刪除數組中索引位置的元素;
        array_splice($allLy, $delIndex ,1);
        // 將新的數組元素寫入到文件中
        if($this->allWrite($allLy)==self ::SUCCCODE)return self ::SUCCCODE;
        //讀寫出現錯誤
        return self ::ERRORCODE;
    }

    //新的數組元素寫入
    private function allWrite($allLy){
        //以覆蓋的方式寫入文件
        $handle   = fopen($this->file_path,"w");
        //初始化寫入字符串
        $writeStr = '';
        foreach($allLy as $lyItem){
            //將item轉成字符串,並進行連接。由於以前addItem定義過這個方法,所以再次獲得複用
            $writeStr.=$this->itemString($lyItem);
        }
        //將字符串寫入
        fwrite($handle,$writeStr);
        fclose($handle);
        //返回操做正確碼
        return self ::SUCCCODE;
    }

結束語

這裏主要對php大體的一些語法和操做進行。編碼的思路我認爲應該是先總體規劃,再部分實現的一個過程。

相關文章
相關標籤/搜索