香港高速VIP云机房火爆上线啦!无需备案,开通即用!配套《巅云自助建站系统3.0》将带给您飞一般的可视化拖拽建站体验,欢迎免费体验。

建站专题

PHP基于面向对象实现的留言本功能实例

一佰互联网站开发设计(www.yinxi.net) 发布日期 2019-04-25 14:40:45 浏览数: 19

本文实例讲述了PHP基于面向对象实现的留言本功能。分享给大家供大家参考,具体如下:

要设计一留言本,一切都将以留言本为核心,抓到什么是什么,按流程走下来,即按用户填写信息->留言->展示的流程进行。

现在用面向对象的思维思考这个问题,在面向对象的世界,会想尽办法把肉眼能看见的以及看不见的,但是实际存在的物或者流程抽象出来。既然是留言本,那么就存在留言内容这个实体,这个留言实体(domain)应该包括留言者姓名、E-mail、留言内容等要素,如下面代码所示

//留言实体类class message{  public $name;//留言者姓名  public $email;//留言者联系方式  public $content;//留言内容  public function __set($name,$value)  {    $this->$name = $value;  }  public function __get($name)  {    if(!isset($this->$name))    {      $this->$name = NULL;    }  }}

上面的类就是所说的domain,是一个真实存在的、经过抽象的实体模型。然后需要一个留言本模型,这个留言本模型包括留言本的基本属性和基本操作,代码如下所示

class gbookModel{  private $bookPath;//留言本文件  private $data;//留言数据  public function setBookPath($bookPath)  {    $this->bookPath = $bookPath;  }  public function getBookPath()  {    return $this->bookPath;  }  public function open()  {  }  public function close()  {  }  public function read()  {    return file_get_contents($this->bookPath);  }  //写入留言  public function write($data)  {    $this->data = self::safe($data)->name."&".self::safe($data)->email." said: ".self::safe($data)->content.PHP_EOL;    return file_put_contents($this->bookPath,$this->data,FILE_APPEND);  }  //模拟数据的安全处理,先拆包再打包  public static function safe($data)  {    $reflect = new ReflectionObject($data);    $props = $reflect->getProperties();    $messagebox = new stdClass();    foreach($props as $props)    {      $ivar = $props->getName();      $messagebox->$ivar = trim($props->getValue($data));    }    return $messagebox;  }  public function delete()  {    file_put_contents($this->bookPath,"it"s empty now");  }}

实际留言的过程可能会更复杂,可能还包括一系列准备操作以及log处理,所以应定义一个类负责数据的逻辑处理,代码如下所示

class leaveModel{  public function write(gbookModel $gb, $data)  {    $book = $gb->getBookPath();    $gb->write($data);    //记录日志  }}

最后,通过一个控制器,负责对各种操作的封装,这个控制器是直接面向用户的,所以包括留言本查看、删除、留言等功能。可以形象理解为这个控制器就是留言本所提供的直接面向使用者的功能,封装了操作细节,只需要调用控制器的相应方法即可,代码如下所示

class authorControl{  public function message(leaveModel $l, gbookModel $g, message $data)  {    //在留言本上留言    $l->write($g,$data);  }  public function view(gbookModel $g)  {    //查看留言本内容    return $g->read();  }  public function delete(gbookModel $g)  {    $g->delete();    echo self::view($g);  }}

测试代码如下所示

$message = new message;$message->name = "chenqionghe";$message->email = "cqh@cqh.net";$message->content = "chenqionghe is a handson boy.";$gb = new authorControl();//新建一个留言相关的控制器$pen = new leaveModel();//拿出笔$book = new gbookModel();//翻出笔记本$book->setBookPath("E:\chenqionghe.txt");$gb->message($pen,$book,$message);echo $gb->view($book);//$gb->delete($book);

这样看起来是不是比面向对象过程要复杂多了?确实是复杂了,代码量增多了,也难理解 。似乎体现不出优点来。但是你思考过以下问题吗?

1.如果让很多人来负责完善这个留言本,一部分实体关系的建立,一部人负责数据操作层的代码,这样是不是更容易分工了呢?

2.如果我要把这个留言本进一步开发,实现记录在数据库中,或者添加分页功能,又该如何呢?

要实现上面的第二问题提出的功能,只需在gookModel类中添加分页方法,代码如下所示

public function readByPage(){    $handle = file($this->bookPath);    $count = count($handle);    $page = isset($_GET["page"]) ? intval($_GET["page"]) : 1;    if($page<1 || $page>$count)      $page = 1;    $pnum = 9;    $begin = ($page-1) * $pnum;    $end = ($begin+$pnum) > $count ? $count :$begin + $pnum;    for($i=$begin; $i<$end; $i++)    {      echo "<strong>",$i+1,"</strong>",$handle[$i],"<br />";    }    for($i=1;$i<ceil($count/$pnum);$i++)    {      echo "<a href="?page=".$i."" rel="external nofollow" rel="external nofollow" >".$i."</a>";    }}

然后到前端控制器里添加对应的action,代码如下所示

public function viewByPage(gbookModel $g){    return $g->readByPage();}

运行结果如下

只需要这么简单的两步,就可以实现所需要的分页功能,而且已有的方法都不用修改,只需要在相关类中新增方法即可。当然,这个分页在实际点击时是有问题的,因为没有把Action分开,而是通通放在一个页面里。对照着上面的思路,还可以把留言本扩展为MySQL数据库的。

这个程序只体现了非常简单的设计模式,这个程序还有许多要改进的地方,每个程序员心中都有一个自己的OO。项目越大越能体现模块划分、面向对象的好处。

下面是完整的代码

<?php//留言实体类class message{  public $name;//留言者姓名  public $email;//留言者联系方式  public $content;//留言内容  public function __set($name,$value)  {    $this->$name = $value;  }  public function __get($name)  {    if(!isset($this->$name))    {      $this->$name = NULL;    }  }}/** * 留言本模型,负责管理留言本 * $bookpath:留言本属性 */class gbookModel{  private $bookPath;//留言本文件  private $data;//留言数据  public function setBookPath($bookPath)  {    $this->bookPath = $bookPath;  }  public function getBookPath()  {    return $this->bookPath;  }  public function open()  {  }  public function close()  {  }  public function read()  {    return file_get_contents($this->bookPath);  }  public function readByPage()  {    $handle = file($this->bookPath);    $count = count($handle);    $page = isset($_GET["page"]) ? intval($_GET["page"]) : 1;    if($page<1 || $page>$count)      $page = 1;    $pnum = 9;    $begin = ($page-1) * $pnum;    $end = ($begin+$pnum) > $count ? $count :$begin + $pnum;    for($i=$begin; $i<$end; $i++)    {      echo "<strong>",$i+1,"</strong>",$handle[$i],"<br />";    }    for($i=1;$i<ceil($count/$pnum);$i++)    {      echo "<a href="?page=".$i."" rel="external nofollow" rel="external nofollow" >".$i."</a>";    }  }  //写入留言  public function write($data)  {    $this->data = self::safe($data)->name."&".self::safe($data)->email." said: ".self::safe($data)->content.PHP_EOL;    return file_put_contents($this->bookPath,$this->data,FILE_APPEND);  }  //模拟数据的安全处理,先拆包再打包  public static function safe($data)  {    $reflect = new ReflectionObject($data);    $props = $reflect->getProperties();    $messagebox = new stdClass();    foreach($props as $props)    {      $ivar = $props->getName();      $messagebox->$ivar = trim($props->getValue($data));    }    return $messagebox;  }  public function delete()  {    file_put_contents($this->bookPath,"it"s empty now");  }}class leaveModel{  public function write(gbookModel $gb, $data)  {    $book = $gb->getBookPath();    $gb->write($data);    //记录日志  }}class authorControl{  public function message(leaveModel $l, gbookModel $g, message $data)  {    //在留言本上留言    $l->write($g,$data);  }  public function view(gbookModel $g)  {    //查看留言本内容    return $g->read();  }  public function viewByPage(gbookModel $g)  {    return $g->readByPage();  }  public function delete(gbookModel $g)  {    $g->delete();    echo self::view($g);  }}$message = new message;$message->name = "chenqionghe";$message->email = "cqh@cqh.net";$message->content = "chenqionghe is a handson boy.";$gb = new authorControl();//新建一个留言相关的控制器$pen = new leaveModel();//拿出笔$book = new gbookModel();//翻出笔记本$book->setBookPath("E:\chenqionghe.txt");$gb->message($pen,$book,$message);//echo $gb->view($book);echo $gb->viewByPage($book);//$gb->delete($book);

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP+MySQL留言板开发专题》、《php缓存技术总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP错误与异常处理方法总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

一佰互联是全国知名建站品牌服务商,我们有九年网站建设、网站制作、网页设计、php开发和域名注册及虚拟主机服务经验,提供的自助建站服务更是全国有名。近年来还整合团队优势自主开发了可视化多用户”巅云建站系统“3.0平台版,拖拽排版网站制作设计,轻松实现pc站、手机微网站、小程序、APP一体化全网营销网站建设 ,已成功的为全国上百家网络公司提供自助建站平台搭建服务。

相关新闻more

29
04月
php的declare控制符和ticks教程

declare 结构用来设定一段代码的执行指令,它的语法结构如下:复制代码 代码如下:declare (directive)statemen... >>详情

12
05月
专业网站建设美好生活的开始

我们的生活节奏太快,我们随着这快节奏的生活在不断的发展,在不断的随之脚步前进着。我们的生活水平随之提高。网络的开展给我们的生活带来了许许多多... >>详情

01
05月
php heredoc和phpwind的模板

在PHP的文档中,只是提到了echo可以使用如下命令输出多行字符串(而且其中的变量被自动替换): PHP代码复制代码 代码如下:echo&l... >>详情

25
04月
PHP实现随机数字、字母的验证码功能

可自定义生成验证码文字的大小、数量、干扰项等等,也可以自定义验证文字的字体。。。废话不多说,直接上代码:1、classgd.class.ph... >>详情

营业执照. cdn加速服务 备案系统认证 网络安全协会 我们的支付方式AAA认证
上海 北京 深圳 广州 天津 杭州 南京 武汉 成都 沈阳 大连 长沙 济南 青岛 苏州 福州 无锡 哈尔滨 宁波 重庆 大庆 厦门 西安 长春 珠海 郑州 海口 昆明 太原 石家庄 温州 合肥 乌鲁木齐 南宁 南通 合肥 兰州 呼和浩特 贵阳 烟台 秦皇岛 包头 唐山 银川 汕头 连云港 威海 西宁 湛江 北海 万州 涪陵 长寿 黔江 永川 丰都 忠县 江津 南川 开县 云阳 万盛 梁平 垫江 巫山 城口 建站宝盒 免费建站 门户网站建设 微信网站 手机网站 门户网站制作

7x24小时服务电话:18581389571 传真:023-85725751 免费建站交流群:236412099 139947842(自助建站交流) E-Mail:post@yinxi.net 网站投诉:
重庆楚捷科技有限公司 一佰互联©版权所有 自助建站(www.yinxi.net,Inc.) 2001-2020 All Rights Reserved 本站程序受法律保护,网站法律顾问:ITLAW-庄毅雄律师
中华人民共和国信息产业部网站备案号:渝ICP备12000592号