假设我在论坛上工作,当然有 用户,以及添加评论,打开主题等的选项。
现在我需要有一些功能, 例如:登录/退出;添加/编辑/删除评论;私信。哦,你明白了。
所以,如果我用oop做到这一点,因为所有这些选项只使用一个巨大的类会非常笨拙,我认为效率较低, 所以最好为上面的每一个做一个课程。但问题是,如果我这样做,我需要在每个类中建立数据库连接, 如果同时使用多个连接到同一个数据库,那将浪费资源。那么,这个问题的最佳解决方案是什么? : - )
答案 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;
}
}
?>