前言
在对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大致的一些语法和操作进行。编码的思路我认为应该是先整体规划,再部分实现的一个过程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。