当前位置: 首页 > 后端技术 > PHP

php学习留言板

时间:2023-03-29 15:04:50 PHP

前言在对php语法有了一定的了解之后,这是第一个php实践项目。涵盖的知识包括参考表的公共部分、提交请求的接收和响应。interface+implements的使用基于增删改查json格式化和字符串序列化项目地址留言板ps:本文不对知识点进行详细介绍,只是简单介绍一下心得。有兴趣阅读的读者可以参考相关代码学习,因为本人是前端出身,前端相关姿势只是简单介绍,但会给出相应的关键词或链接;整体结构介绍root│addMess.php│delMess.php│index.php│show.php│├─commom_view│head.html│├─common│lyfile.php│├─css│bootstrap.min.css│└─dataliuyan.txtphp相关请求直接放在根目录下,commom_view存放相同部分的视图,引入bs的样式文件存放在css中。data文件夹中存放数据txt文件,common文件夹中存放数据的liuyan.txt文件夹读取相关方法;编写过程的公共部分1.先写包含标题和相关功能页面链接的publicheader,为了让整体页面更好的引入[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跳转的形式chain通过get请求,因为我们这里需要做的是删除某条消息Data然后刷新列表的本地操作,不适合跳转链接。2、使用delMess()删除数据,详见[lyfile写法](#lyfile);3、相关手势包括:$.ajax发送请求、es6字符串模板、页面元素内容赋值、php请求返回echoxxx;..至此,整体结构就完成了。lyfile的写法Lyfile是我花了不少时间的一块,所以单独说一下。前三段主要讲个人写作方法的必要性;接口的必要性*锻炼整体把握项目所需功能的能力;*实现者可以通过接口的描述一个一个实现功能,不受其他干扰;*调用者可以通过接口的介绍了解接口的调用方式;*虽然接口可以被继承,但是他不是一个类。使用类的必要性*为了提高复用性,使用$this->xxx调用相关参数,调用者可以通过实例化相关类来调用相关方法;*安全,只有提供相关接口的方法才能被调用,否则无法调用;*扩展性,当需要添加新的接口时,只需要在内部添加相应的方法即可,不受其他接口的影响;内部变量*file_path因为所有文件都保存在liuyan.txt文件中所以file_path保存了文件的路径*常量ERRORCODE和SUCCCODE静态识别错误和纠正状态,避免在代码中使用-1,0标志,改进代码可读性addItem*首先明白它需要做什么:1.获取数据,2.添加相应的id(为什么要这样做,在delItem中会解释),3.写入lyfile.txt;*新的数据获取是从调用处传过来的,这里不再赘述;*添加id:这里获取的是上一条消息的id值(不是index值),加上+1保持id的唯一性,具体优劣码来说明;*一条数据以一行的形式存储;publicfunctionaddItem($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);}//获取最后一行的idprivatefunctiongetLastId(){//获取所有文件内容$lyData=$this->getAll();//计算行数$lyLen=count($lyData);//没有数据时,返回位置-1;如果($lyLen==0)返回-1;//否则返回对应的id;返回$lyData[$lyLen-1]['id'];}//获取所有文件的内容publicfunctiongetAll(){//逐行读取文件并以数组的形式返回,每一项都是一个项目字符串;$all_item=文件($this->file_path);//声明返回的变量数组$dataArr=array();//文件字符数组,方便阅读groupforeach($all_itemas$item){//将字符串转成数组(注意json_decode的第二个参数,如果不加,返回的是一个对象),并添加到返回的变量数组array_push($dataArr,json_decode($item,true));}返回$dataArr;}//数组转成字符串并加换行,这里不再赘述privatefunctionitemString($item_data){$item_str=json_encode($item_data);$item_str.="\r\n";返回$item_str;}getAll聪明的同学已经发现上面已经实现了这个功能,大家可以拿起来愉快的使用,不用再写了。delItem需要做的是1.通过id找到对应的item,2.找到则删除并返回成功码,否则返回错误码publicfunctiondelItem($id){//获取所有数据$allLy=$这个->getAll();//初始化要删除的索引$delIndex=-1;//找到要删除的ID对应的对象foreach($allLyas$curIndex=>$lyItem){//如果找到对应的id赋值$delIndexif($lyItem["id"]==$id){$delIndex=$curIndex;休息;}}//如果没有找到索引号,直接退出并返回错误码(对象中常量的引用是self::CONSTVAR)if($delIndex==-1)returnself::ERRORCODE;//删除数组中索引位置的元素;array_splice($allLy,$delIndex,1);//将新的数组元素写入文件if($this->allWrite($allLy)==self::SUCCCODE)returnself::SUCCCODE;//读写错误returnself::ERRORCODE;}//新数组元素写入私有函数allWrite($allLy){//通过覆盖写入文件$handle=fopen($this->file_path,"w");//初始化并写入字符串$writeStr='';foreach($allLyas$lyItem){//将item转成字符串链接起来,因为addItem之前定义了这个方法,所以再次复用$writeStr.=$this->itemString($lyItem);}//将字符串写入fwrite($handle,$writeStr);fclose($句柄);//返回正确的代码returnself::SUCCCODE;}结束语这里我们主要关注PHP的一些通用语法和操作。我觉得coding的思路应该是一个先整体规划,再局部实现的过程。