2

前言

在对php语法有一定了解之后开始,这是第一个php练手项目,涵盖的知识有

  • 公共部分的引用

  • 表单的提交

  • 请求的接收与响应

  • interface+implements的使用

  • 基于文件的所处理的增删改查

  • json的格式化与字符串序列化

  • 项目地址message board
    ps:本文不详细介绍知识点,只是大概描述下心得,阅读者如果有心阅读可以参看相关代码学习,由于本人前端出身,对前端相关姿势也只是一笔带过,但是会给出相应关键字或链接;

整体结构的介绍

  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文件夹读取相关方法;

编写过程

公共部分

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;

..到这,整体结构就完成了。

<span id="lyfile">lyfile的编写</span>

lyfile是我花的时间比较多的一块,因此单独拉出来讲,前三段主要说个人对自己书写方式的必要性;

interface的必要性

* 锻炼对项目所需要功能的整体把握能力;

* 实现者可以通过interface的描述对功能进行逐个实现,不受其他干扰;

* 调用者可以通过interface相关介绍,了解接口调用方式;

* interface虽然可以继承,但他不是类。

使用类的必要性

* 提高复用性,自身调用相关参数采用$this->xxx进行调用,调用者通过实例化相关类,调用相关方法;

* 安全性,只有提供相关接口的方法才能进行调用,否则不能调用;

* 延展性,当需要添加新的接口时,之需要在内部再进行新增相应方法即可,不受其他接口影响;

内部变量

* file_path 因为所有的文件都存储在liuyan.txt文件上,因此file_path就保存该文件的路径

* 常量 ERRORCODE、SUCCCODE静态标识错误和正确状态,避免再代码中使用-1,0标识,提高代码可读性

addItem

* 首先了解其要做的事:1、获取数据,2、添加相应的id(为啥这么干将在delItem进行说明),3、再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

这要干的就是1、通过id找到相应的项,2、找到就删除并返回成功码,否则返回错误码


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


菜lee
732 声望4 粉丝

前端混子