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


Posted in PHP onApril 04, 2018

本文实例讲述了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();
}

运行结果如下

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

只需要这么简单的两步,就可以实现所需要的分页功能,而且已有的方法都不用修改,只需要在相关类中新增方法即可。当然,这个分页在实际点击时是有问题的,因为没有把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 相关文章推荐
用定制的PHP应用程序来获取Web服务器的状态信息
Oct 09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
Jul 18 PHP
mysql总结之explain
Feb 27 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 PHP
php外部执行命令函数用法小结
Oct 11 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
基于php实现的验证码小程序
Dec 13 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 PHP
php redis setnx分布式锁简单原理解析
Oct 23 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 #PHP
PHP设计模式之原型模式定义与用法详解
Apr 03 #PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 #PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 #PHP
PHP延迟静态绑定的深入讲解
Apr 02 #PHP
PHP设计模式之装饰器模式定义与用法详解
Apr 02 #PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 #PHP
You might like
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP无限分类(树形类)
2013/09/28 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
DOM精简教程
2006/10/03 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
铁路工务反思材料
2014/02/07 职场文书
车辆委托书范本
2014/10/05 职场文书
旅游项目合作意向书
2015/05/08 职场文书
英语导游欢迎词
2015/09/30 职场文书
2017新年晚会开幕词
2016/03/03 职场文书