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大体的一些语法和操做进行。编码的思路我认为应该是先总体规划,再部分实现的一个过程。

相关文章
相关标签/搜索