2009-12-21 79 views
0

我想要做的就是访问我的数据库类中的查询函数。 Evey时间查询完成后,我会跟踪所需时间并添加查询计数,我希望为所有查询都做到这一点。从其他类访问类中的函数

布局我现在是:

   Global 
    ----------------------------- 
    |       | 
database class   application class 
           | 
          program class 

当数据库类开始将它连接到数据库,并做一些查询的。下一次需要的是在课程中。

我需要保留querycount和totaltime变量并添加到它们。我也想要一个简单的函数调用,我不想为每个程序启动这个类。它接近应该有一种方法来在应用程序级别调用它,并且能够在程序级别使用查询功能并在全局级别使用查询功能。

我希望这是有道理的,我知道我想要什么,但我已经把它变成文字的问题......

+0

也许编辑:'功能' - >'功能'?如果可以的话,我会这样做,但我没有足够的代表来自己做... – 2009-12-21 09:46:56

+0

鉴于目前的答案涵盖了一些话题,你可能想要添加一些更多的信息到你的问题,使它更清楚你想要达到的目标。 – Gordon 2009-12-21 10:37:59

回答

1

我不确定我是否正确理解了您的问题,但我建议您将静态变量引入到您的数据库类中,然后用它来存储您希望该类“记住”的数据。就像这样:

class Database 
{ 
public static $queryCount = 0; 
public static $queryDuration = 0; 

/* 
    ... the rest of your database stuff 
*/ 
} 

这两个变量都可以通过数据库:: $ queryCount和数据库:: $ queryDuration访问,将保持其值在类而不是实例化的对象。

内,您的查询方法,您可以更新它们的值,如:

Database::$queryCount++; 

,并在你的脚本的末尾,你可以阅读他们的内容。

+0

据我所知,尽管将它们声明为“public”是没有意义的,因为它们只应在类中调用类似query()的类时更新。 – Franz 2009-12-21 09:37:43

+0

对,更清晰的方法是将其声明为私有或受保护,并通过类内的适当方法访问它们。但我只想用尽可能少的代码在这里展示我的观点:) – selfawaresoup 2009-12-21 10:16:13

+0

是的,我可以看到这一点。然而,我的意思是,他们不应该被允许从课外开始。 – Franz 2009-12-21 10:25:36

0

看一看Zend_Db_Profiler,因为它正是这样做的。你可能会从那里得到你自己的代码的一些想法。

如果我必须自己做,我可能会为数据库类编写一个Profiler Decorator,这个数据库类会在每次运行查询时为我收集查询统计信息。

另一种选择是让您的DB类和Profiler类使用Subject/Observer模式,其中每次运行查询时DB类都会通知分析器。

或者您可以简单地将Profiler实例注入到DB类中,并将DB类中的集合委托给分析器。

但是,我会不是解决集合,因为这样的DB类中的静态属性,因为这个统计收集不是类的关注。

除此之外,我建议你延迟到数据库的实际连接调用到需要时。第一次实例化DB类时不要连接,但要将该代码放入连接方法中。然后当有人调用你的查询方法时,检查连接是否被调用,如果没有,请运行connect()。如果没有任何问题被询问,则无需进行连接。

0

我想你可以看看工厂模式(使创建不同类型的数据库更容易的子类,也

让我提供低于它的修改版本。

class Database 
{ 
    protected static $instance = NULL; 

    public static function factory($type = '') 
    { 
     $type = strtolower($type); 

     if (self::$instance == NULL) 
     { 
      $className = 'Database_'.ucfirst($type); 

      // Include the class and do some checks here 

      self::$instance = new $className; 
     } 

     return self::$instance; 
    } 

你可以创建数据库,无论你用这段代码创建:

$db = Database::factory('mysql'); 

之后,你可以在全球范围访问数据库对象是这样的:

$db = Database::factory(); 

你的子类必须存储在名为像Database_MysqlDatabase_Postgresql类。