使用几个使用数据库连接的类

时间:2012-06-30 09:48:54

标签: php mysql oop class

假设我在论坛上工作,当然有 用户,以及添加评论,打开主题等的选项。

现在我需要有一些功能, 例如:登录/退出;添加/编辑/删除评论;私信。哦,你明白了。

所以,如果我用oop做到这一点,因为所有这些选项只使用一个巨大的类会非常笨拙,我认为效率较低, 所以最好为上面的每一个做一个课程。但问题是,如果我这样做,我需要在每个类中建立数据库连接, 如果同时使用多个连接到同一个数据库,那将浪费资源。那么,这个问题的最佳解决方案是什么? : - )

3 个答案:

答案 0 :(得分:0)

在OOP中,您只需创建对象即可。他们做他们应该做的事。

当我写作时,你只是创建对象,我的意思是字面意思。到目前为止还没有数据库,你不关心这些对象是如何存储的。

编写单元测试,让对象运行它们应该做的事情。

然后开始将这些对象组合在一起。它们仍然不需要存储。把它们放在一起,比如:

$user = $session->getUser();
$user->login(username, password);

等等。您的应用程序应该不需要关心数据库。

然后,在最终确定应用程序时,在每个操作中实例化对象的位置旁边,还可以实例化一个能够从数据存储中获取对象的DataMapper

User <--> UserMapper <--> Datastore

如您所见,User对象对Datastore一无所知,甚至与UserMapper无关。 UserMapper知道User是什么,但如上所述,这是后来的,所以首先让你的重要对象运行,为它们编写单元测试,然后进行集成测试然后当你运行这样做,开始考虑数据库 - 无论那时是什么时候。

答案 1 :(得分:-1)

OOP是关于将代码逻辑隔离到专用块中的,但它具有在需要时进行共享,继承和互操作的基础。考虑到这一点,将连接声明为类的静态属性(因为可能不需要为每个实例重新创建它)。

无论您的主要代码块是基类论坛类的类扩展还是方法,这都会起作用(并且效率很高)。

class Forum {
    public static $db = "I'm the database!";
    public function post() {
        echo self::$db;
    }
}
class Post extends Forum {
    public function getDB() {
        echo parent::$db;
    }
}

//post as its own sub-class
$post = new Post();
$post->getDB(); //I'm the database!

//post as method of class
$forum = new Forum();
$forum->post(); //I'm the database!

[编辑] - 似乎PHP无法解析静态属性的非平凡值,即它们不能是表达式或函数调用。

这方面的一个方法如下:

class Forum {
    static $db;
    public function post() {
        self::$db; //do something with DB connection here
    }
}
Forum::$db = new mysqli(); //<-- the key - screw you, static property limitations
class Post extends Forum {
    public function getDB() {
        parent::$db; //do something with DB connection here
    }
}

...即。我们在类声明之后声明静态属性(我们的数据库处理程序)。其他人可能知道更优雅的方式。

答案 2 :(得分:-1)

使用此代码。以Databasehandler.php的名称保存它。并将其包含在index.php中,并在整个项目中随时使用其功能。它使用PDO对您的数据库进行安全查询。可能需要进行少量修改

    <?php

Class DatabaseHandler
{
    private static $_mhandler;

    private function __construct() { }

    private static function GetHandler()
    {
        if(!isset($_mhandler))
        {
            try
            {
                self::$_mhandler = new PDO (PDO_DSN, DB_USERNAME, DB_PASSWORD, array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));
                self::$_mhandler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch(PDOException $e)
            {
                self::Close();
                trigger_error($e -> getMessage(), E_USER_ERROR);
            }

            return self::$_mhandler; // Returning DATABASE Handler Object.
        }
    }

    public static function Close()
    {
        $_mhandler = NULL;
    }

    public static function Execute($sqlquery, $params = NULL)
    {
        try
        {
            $dbh = self::GetHandler(); //DataBaseHandler
            $sth = $dbh -> prepare($sqlquery); //StatementHandler
            $sth -> execute($params);
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }

    }

    public static function GetAll($sqlquery, $params = NULL, $fetchstyle = PDO::FETCH_ASSOC)
    {
        $result = NULL;

        try
        {
            $dbh = self::GetHandler();
            $sth = $dbh -> prepare($sqlquery);
            $sth -> execute($params);
            $result = $sth -> fetchAll($fetchstyle);
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }
        return $result;
    }


    public static function GetRow($sqlquery, $params = NULL, $fetchstyle = PDO::FETCH_ASSOC)
    {
        $result = NULL;

        try
        {
            $dbh = self::GetHandler();
            $sth = $dbh -> prepare($sqlquery);
            $sth -> execute($params);
            $result = $sth -> fetch($fetchstyle);
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }
        return $result;
    }


    public static function GetOne($sqlquery, $params = NULL)
    {
        $result = NULL;

        try
        {
            $dbh = self::GetHandler();
            $sth = $dbh -> prepare($sqlquery);
            $sth -> execute($params);
            $result = $sth -> fetch(PDO::FETCH_NUM);
            $result = $result[0];
        }
        catch(PDOException $e)
        {
            self::Close();
            trigger_error($e -> getMessage(), E_USER_ERROR);
        }
        return $result;
    }
}


?>