当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP5 OOP编程之代理与定制异常(1)

PHP
php 多线程上下文中安全写文件实现代码
PHP类的使用 实例代码讲解
用php实现让页面只能被百度gogole蜘蛛访问的方法
php 学习笔记
PHP编程过程中需要了解的this,self,parent的区别
php 操作excel文件的方法小结
使用PHP获取网络文件的实现代码
PHP 巧用数组降低程序的时间复杂度
php下将XML转换为数组
php 文件上传代码(限制jpg文件)
php 无极分类(递归)实现代码
PHP 采集获取指定网址的内容
PHP 将图片按创建时间进行分类存储的实现代码
PHP 存储文本换行实现方法
PHP 批量更新网页内容实现代码
用PHP查询搜索引擎排名位置的代码
用php实现的获取网页中的图片并保存到本地的代码
php实现首页链接查询 友情链接检查的代码
处理php自动反斜杠的函数代码
php实现的遍历文件夹下所有文件,编辑删除

PHP5 OOP编程之代理与定制异常(1)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 97 ::
收藏到网摘: n/a

一、 DBQuery对象

现在,我们的DBQuery对象简单地模仿一个存储过程—一旦被执行,即返回一个必须进行保存的结果资源;并且如果你想使用该结果集上的函数(例如num_rows()或fetch_row())的话,你必须传递MySqlDB对象。那么,如果由DBQuery对象来实现MySqlDB对象(其设计目的是对一个执行查询的结果进行操作)实现的函数,效果如何呢?让我们继续使用上一篇示例中的代码;并且让我们假定,现在由DBQuery对象管理我们的结果资源。DBQuery类的源码如列表1所示。

列表1.使用DBQuery类。

require 'mysql_db.php';

require_once 'query.php';

$db = new MySqlDb;

$db->connect('host', 'username', 'pass');

$db->query('use content_management_system');

$query = new DBQuery($db);

$query->prepare('SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3I');

try {

if($query->execute("visualad", "apron", time()))->num_rows() == 1) {

echo('Correct Credentials');

} else {

echo('Incorrect Credentials / Session Expired');

}

} catch (QueryException $e) {

echo('Error executing query: ' . $e);

上面修改后的代码中我们最感兴趣的是,catch语句和execute语句。

· execute语句不再返回一个结果资源,现在它返回DBQuery对象本身。

· DBQuery对象现在实现num_rows()函数—我们从DB接口中已经熟悉。

· 如果查询执行失败,它抛出一个QueryException类型的异常。当被转换成一个字符串时,它将返回发生的错误的细节信息。

为此,你需要使用代理。事实上,你在我们的DBQuery对象中已经使用代理了,但是现在将更为深入地使用它来把它与MySqlDB对象紧密绑定。该DBQuery对象已经被使用一个实现DB接口的对象初始化,并且它已经包含一个成员函数execute—由它调用DB对象的query()方法来执行该查询。这个DBQuery对象本身并不实际地查询数据库,它把这项任务交由DB对象来完成。这就是代理,其实是一个进程—借助于这个进程,通过把消息发送给另一个实现相同的或类似行为的对象,一个对象可以实现一个特别的行为。

  为此,你需要修改DBQuery对象以便包括所有的函数—它们操作一个来自DB对象的结果资源。当执行查询以调用DB对象的相应函数并且返回它的结果时,你需要使用存储的结果。下列函数将被添加:

列表2:使用代理扩展DBQuery类。

class DBQuery

{

.....

public function fetch_array()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->fetch_array($this->result);

}

public function fetch_row()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->fetch_row($this->result);

}

public function fetch_assoc()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}
return $this->db->fetch_assoc($this->result);

}

public function fetch_object()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->fetch_object($this->result);

}

public function num_rows()

{

if (! is_resource($this->result)) {

throw new Exception('Query not executed.');

}

return $this->db->num_rows($this->result);

}

每个函数的实现相当简单。它首先进行检查,以确保已经执行查询,然后把任务代理到DB对象,返回它的结果就好象它是查询对象本身(称作是基本数据库函数)一样。

二、 类型提示(Type Hinting)

为了使代理能够工作,我们需要确保DBQuery对象的$db变量是一个实现了DB接口的对象的实例。类型提示是PHP 5中的一种新特征,它能够使你把函数参数强制转换成特定类型的对象。在PHP 5之前,唯一的确保函数参数是一个特定对象类型的方法是使用PHP中所提供的类型检查函数(也即是is_a())。现在,你可以简单地强制转换对象类型—通过在函数参数的前面加上类型名。你已经从我们的DBQuery对象中看到了类型提示,这样可以确保一个实现DB接口的对象被传递到对象构造器中。

public function __construct(DB $db)

{

$this->db = $db;

}

当使用类型提示时,你不仅可以指定对象类型,还可以指定抽象类和接口。