从其他类访问类中的函数

时间:2009-12-21 09:25:21

标签: php oop class class-design

我想要做的是访问我的数据库类表单anther类中的查询函数。 Evey查询完成的时间我跟踪所需的时间并添加查询计数,我想对所有查询执行此操作。

我现在的布局是:

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

当数据库类启动时,它连接到数据库并进行一些查询。下次需要的是程序类。

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

我希望这是有道理的,我知道我想要什么,但我把问题付诸实践......

5 个答案:

答案 0 :(得分:1)

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

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

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

可以通过Database :: $ queryCount和Database :: $ queryDuration访问这两个变量,并将它们的值保存在类中,而不是实例化的对象。

在查询方法中,您可以更新其值,如:

Database::$queryCount++;

在脚本结束时,您可以阅读其内容。

答案 1 :(得分:0)

PHP的静态关键字是您需要查看的内容。

http://php.net/manual/en/language.oop5.static.php

请注意,如果有很多类调用静态方法,则可能需要考虑线程问题。

答案 2 :(得分:0)

一种方法是使您的类的函数保持静态,您可以立即使用它们。其他可能性是扩展包含您要调用的函数的类。您还可以使用call_user_func_array函数从任何类调用函数。

无论如何,这个视频是我认为的问题的答案:

http://www.killerphp.com/videos/calling_functions_from_another_class.php

答案 3 :(得分:0)

请查看Zend_Db_Profiler,因为它确实如此。您可以从那里获得自己代码的一些想法。

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

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

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

但是,我会在具有静态属性的DB类中解析集合,因为此统计集合不是该类的关注点。

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

答案 4 :(得分:0)

我认为您可以查看Factory模式(使得为不同数据库类型创建子类也更容易。

让我在下面提供它的修改版本:

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的类中。