在对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
lyfile是我花的时间比较多的一块,所以单独拉出来说,前三段主要说我的对本身书写方式的必要性;
* 锻炼对项目所须要功能的总体把握能力; * 实现者能够经过interface的描述对功能进行逐个实现,不受其余干扰; * 调用者能够经过interface相关介绍,了解接口调用方式; * interface虽然能够继承,但他不是类。
* 提升复用性,自身调用相关参数采用$this->xxx进行调用,调用者经过实例化相关类,调用相关方法; * 安全性,只有提供相关接口的方法才能进行调用,不然不能调用; * 延展性,当须要添加新的接口时,之须要在内部再进行新增相应方法便可,不受其余接口影响;
* file_path 由于全部的文件都存储在liuyan.txt文件上,所以file_path就保存该文件的路径 * 常量 ERRORCODE、SUCCCODE静态标识错误和正确状态,避免再代码中使用-1,0标识,提升代码可读性
* 首先了解其要作的事:一、获取数据,二、添加相应的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; }
机智的同窗早已发现,在上面已经实现了这个函数,那么我们就能够愉快的拿起来用了,不用再重复写了。
这要干的就是一、经过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大体的一些语法和操做进行。编码的思路我认为应该是先总体规划,再部分实现的一个过程。