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

天天旺农家店

天天旺农家店

2016-01-29 13:39

PHP5 OOP编程之代理与定制异常,PHP5 OOP编程之代理与定制异常

      现在,我们的DBQuery对象简单地模仿一个存储过程一旦被执行,即返回一个必须进行保存的结果资源

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/php/)

一、 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对象,返回它的结果就好象它是查询

展开更多 50%)
分享

猜你喜欢

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

PHP
PHP5 OOP编程之代理与定制异常

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

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

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

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

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

PHP5的异常处理机制

PHP
PHP5的异常处理机制

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

初探 PHP5

PHP
初探 PHP5

初探PHP5

Web开发
初探PHP5

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《噬神者》各荒神的近战攻略(猴子篇)

《噬神者》各荒神的近战攻略(猴子篇)

《战场女武神2》攻守、武器多杀等详细攻略

《战场女武神2》攻守、武器多杀等详细攻略
下拉加载更多内容 ↓