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

2016-01-29 13:00 2 1 收藏

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

【 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对象,返回它的结果就好象它是查询对象本身(称作是基本数据库函数)一样。

  二、 类型提示(Type Hinting)

  为了使代理能够工作,我们需要确保DBQuery对象的$db变量是一个实现了DB接口的对象的实例。类型提示是PHP 5中的一种新特征,它能够使你把函数参数强制转换成特定类型的对象。在PHP 5之前,唯一的确保函数参数是一个特定对象类型的方法是使用PHP

来源:https://www.tulaoshi.com/n/20160129/1488530.html

延伸阅读
标签: PHP
虽然 PHP5 还没有正式发布(开发版本已经提供下载),但我们现在就可以开始体验一下新的版本 将要带给我们的惊喜。在以下的介绍中,我们将重点讲述 PHP5 中的三大特色功能。这三大特点为: * 新的对象模式 (New Object Mode) * 异常处理 (Exceptions) * 名称空间 (Namespace) 在开始之前,要声明两点: * 文章中的例子为了说...
标签: Web开发
接上篇,继续硬着头皮往下翻。。。。:) 类型指示 在PHP5,你可以在一个类的方法中指明其参数必须为一个类的实例: Example 10: 类型实例 ?php class foo {   // code ... } class bar {   public function process_a_foo(foo $foo) {    // Some code   } } $b = new bar(); $f = new f...
标签: Web开发
本文介绍的是Windows 2000下PHP+IIS的安装方法(ISAPI方式) 1,把php-5.0.0-Win32.zip解压放到C:\php 2,php.ini-dist改名为php.ini,找到第438行改成 extension_dir = c:\php\ext3,去掉565行;extension=php_mysql.dll前面的";"注释符号 4,复制php.ini到Winnt目录下,再复制php5ts.dll和libmysql.dll到WINNT\system32\中 5,打开IIS,添加一个php后...
标签: PHP
抽象类 抽象类不能被实例化。 抽象类与其它类一样,允许定义变量及方法。 抽象类同样可以定义一个抽象的方法,抽象类的方法不会被执行,不过将有可能会在其派生类中执行。 例六:抽象类 <?php abstract class foo { protected $x; abstract function display(); function setX($x) { $this-x = $x; } } class foo2 extend...
标签: Web开发
数据加密在我们生活中的地位已经越来越重要了,尤其是考虑到在网络上发生的大量交易和传输的大量数据。如果对于采用安全措施有兴趣的话,也一定会有兴趣了解PHP提供的一系列安全功能。在本篇文章中,我们将介绍这些功能,提供一些基本的用法,以便你能够为自己的应用软件中增加安全功能。预备知识在详细介绍PHP的安全功能之前,我们需要花点...

经验教程

11

收藏

14
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部