Skip to content

一个面向对象留言本的实例

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

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

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

<?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;
        }
    }       
}

然后,需要一个留言本模型,这个留言本模型包括留言本的基本属性和基本操作,如下所示(留言本模型 gbookModel.php)。

<?php
/**
 * 留言本模型,负责管理留言本
 * @author asus
 *
 */
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); // 第三个参数代表,如果文件 filename 已经存在,追加数据而不是覆盖
    }

    // 模拟数据的安全处理,先拆包再打包
    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, '');
    }
}

实际留言的过程可能会更复杂,可能还包括一系列准备工作以及 Log 处理,所以应定义一个类负责数据的逻辑处理,如下所示(留言本业务逻辑处理 leaveModel.php)。

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

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

<?php
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();
    }
}

测试代码如下:

<?php   
$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("./a.txt");
$gb->message($pen, $book, $message);
echo $gb->view($book);

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*