PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 高级应用 >> 

PHP设计模式介绍 第十四章 动态记录模式

PHP设计模式介绍 第十四章 动态记录模式

来源:互联网  作者:  发布时间:2010-05-22
到目前为止,您所看到的这些设计模式大大提高了代码的可读性与

以下代码实现上述实验的要求。

class  Bookmark  {
//  ...
const  SELECT_BY_URL  =  “
select  id
from  bookmark
where  url  like  ?”;
public  static  function  findByUrl($url)  {
$rs  =  DB::conn()->execute(
self::SELECT_BY_URL
,array(“%$url%”));
$ret  =  array();
if  ($rs)  {
foreach  ($rs->getArray()  as  $row)  {
$ret[]  =  new  Bookmark($row[‘id’]);
}
}
return  $ret;
}
}

更新记录

CRUD操作中的建立与读取部分介绍完毕。何如更新数据呢?当然用save()方法来更新activate record对象是合理的,但目前save()方法只能完成插入数据,其代码如下

class  Bookmark{
//  ...
const  INSERT_SQL  =  “
insert  into  bookmark  (url,  name,  description, tag,  created,  updated)
values  (?,  ?,  ?,  ?,  now(),  now())
“;
protected  function  save()  {
$rs  =  $this->conn->execute(
self::INSERT_SQL
,array($this->url,  $this->name,
$this->description,  $this->tag));
if  ($rs)  {
$this->id  =  (int)$this->conn->Insert_ID();
}  else  {
trigger_error(‘DB  Error:  ‘.$this->conn->errorMsg());
}
}
}

然而,如果你已有一个有效的书签实例,则你应该希望看到如下代码

class  Bookmark  {
//  ...
const  UPDATE_SQL  =  “
update  bookmark  set url  =  ?,
name  =  ?, description  =  ?, tag  =  ?,
updated  =  now()
where  id  =  ?
“;
public  function  save()  {
$this->conn->execute(
self::UPDATE_SQL
,array(
$this->url,
$this->name,
$this->description,
$this->tag,
$this->id));
}
}

要区别INSERT与UPDATE,你应该测试书签数据是新建的还是从数据库中获取得的。

首先,重新制作两个版本的save()方法,分别命令为insert()与update()。

class  Bookmark  {
//  ...
protected  function  insert()  {
$rs  =  $this->conn->execute(
self::INSERT_SQL
,array($this->url,  $this->name,
$this->description,  $this->tag));
if  ($rs)  {
$this->id  =  (int)$this->conn->Insert_ID();
}
}
protected  function  update()  {
$this->conn->execute(
self::UPDATE_SQL
,array(
$this->url,
$this->name,
$this->description,
$this->tag,
$this->id));
}
}

现在你新的save()方法的代码就如下所示了。

class  Bookmark  {
const  NEW_BOOKMARK  =  -1;
protected  $id  =  Bookmark::NEW_BOOKMARK;
//  ...
public  function  save()  {
if  ($this->id  ==  Bookmark::NEW_BOOKMARK)  {
$this->insert();
}  else  {
$this->update();
}
}
}

最后一个问题:当你插入或是更新记录时,时间戳总是要改变的。如果不采取从数据库中获取时间戳的手段,则没有更好的方法在书签对象中记录准确的时间戳了。因为在插入与修改中都要应用到,所以要更改Activate Record类,当save()方法完成后,就更新时间戳(实例的相关属性值),以避免后来产生的不同步。


延伸阅读:
从魔兽看PHP设计模式
《PHP设计模式介绍》导言
PHP设计模式介绍 第一章 编程惯用法
PHP设计模式介绍 第二章 值对象模式
PHP设计模式介绍 第三章 工厂模式
PHP设计模式介绍 第四章 单件模式
PHP设计模式介绍 第五章 注册模式
PHP设计模式介绍 第六章 伪对象模式
PHP设计模式介绍 第七章 策略模式
PHP设计模式介绍 第八章 迭代器模式


PHP设计模式介绍 第九章 观测模式
PHP设计模式介绍 第十章 规范模式
PHP设计模式介绍 第十一章 代理模式
PHP设计模式介绍 第十二章 装饰器模式
PHP设计模式介绍 第十三章 适配器模式
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号