0

我终于开始从程序 PHP 转换为 OO PHP,从 mysql_XXX 转换为 mysqli。我有一个关于 mysqli 和 OOPHP 的快速问题。假设我创建了一个新的 mysqli 对象,并希望在不同的页面上使用该对象来访问数据库。将创建的对象放入会话变量中的最佳做法是

$_SESSION['dbSession'] = new mysqli('host','user','pass','database');

我可以传递,还是我应该遵循其他一些[真正的]最佳实践?

4

2 回答 2

0

这将根据具体情况而有所不同,但是我认为可以肯定地说,将您的数据库处理程序存储在会话中并不是一个好的做法(额外的内存使用,不需要真正保存它等等)。

你应该看看依赖注入,在这里阅读。这将使单元测试更容易。但请不要将其存储在会话中。请。

于 2013-09-18T19:45:28.120 回答
0

我曾经像这样将数据库类创建为单例。不是每个人都喜欢这种方法,但它便于包装。

class Database
{
   private $_instance = null;

   public static function getInstance()
   {
      if( !(self::$_instance instanceof MySQLi) )
         self::createInstance();

      return self::_instance;
   }

   private static function createInstance()
   {
       // Create DB object here and store in self::$_instance
   }
}

显然会传递配置数据,而这只是一个伪摘要。您可以像这样使用该类:

$myDb = Database::getInstance();

这将在每个单独的请求上重新创建您的数据库连接,但如果您在单个请求中进行多个查询,则会重用相同的连接。


至于将 MySQLi 对象存储在 SESSION 中,它只是行不通。您可以序列化对象并将它们放在 中$_SESSION,但有些对象是特殊的并且故意不允许这样做。例如,如果您尝试将 PDO 对象序列化以存储在 SESSION 中,则会抛出此错误:

致命错误:在 ...

于 2013-09-18T19:46:59.590 回答