频道栏目
读书频道 > web开发 > php > PHP核心技术与最佳实践
2.2 一个面向对象留言本的实例
2012-12-03 13:42:25     我来说两句
收藏   我要投稿

本文所属图书 > PHP核心技术与最佳实践

这是一本致力于为希望成为中高级PHP程序员的读者提供高效而有针对性指导的经典著作。本书系统归纳和深刻解读了PHP开发中的编程思想、底层原理、核心技术、开发技巧、编码规范和最佳实践。 全书分为5个部分:第一...  立即去当当网订购

在这一节,用面向对象的思想完成一个简单的留言本模型,这个模型不涉及实际的数据库操作以及界面显示,只是一个demo,用来演示面向对象的一些思维。

在面向过程的思维里,要设计一个留言本,一切都将以留言本为核心,抓到什么是什么,按流程走下来,即按用户填写信息→留言→展示的流程进行。

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

代码清单2-16 留言实体类message.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;

}

}

}

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

代码清单2-17 留言本模型gbookModel.php

/**

*留言本模型,负责管理留言本

*$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 write($data){

$this->data=self::safe($data)->name."&".self::safe($data)->email."\r\nsaid:\r\n".self::safe($data)->content;

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 $prop) {

$ivar=$prop->getName();

$messagebox->$ivar=trim($prop->getValue($data));

}

return $messagebox;

}

public function delete(){

file_put_contents($this->bookPath,'it's empty now');  }

}

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

代码清单2-18 留言本业务逻辑处理leaveModel.php
  
class leaveModel{

public function write(gbookModel $gb,$data){

$book=$gb->getBookPath();

  
$gb->write($data);

// 记录日志

}

}

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

代码清单2-19 前端控制部分代码

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='phper';

$message->email='phper@php.net';

$message->content='a crazy phper love php so much.';

$gb=new authorControl();// 新建一个留言相关的控制器

$pen=new leaveModel();// 拿出笔

$book=new gbookModel();// 翻出笔记本

$book->setBookPath("g:\\bak\\temp\\tempcode\\a.txt");

$gb->message($pen,$book,$message);

echo $gb->view($book);

$gb->delete($book);

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

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

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

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

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}>${i}</a>";

}

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

public function viewByPage(gbookModel $g){

return $g->readByPage();

}

运行结果如图2-5所示。


 

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

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

思考 试着找找这个小程序里体现了哪些设计原则,并且试着加上一些异常处理等。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.1.5 依赖倒置原则
下一篇:2.3 面向对象的思考
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站