我终于开始从程序 PHP 转换为 OO PHP,从 mysql_XXX 转换为 mysqli。我有一个关于 mysqli 和 OOPHP 的快速问题。假设我创建了一个新的 mysqli 对象,并希望在不同的页面上使用该对象来访问数据库。将创建的对象放入会话变量中的最佳做法是
$_SESSION['dbSession'] = new mysqli('host','user','pass','database');
我可以传递,还是我应该遵循其他一些[真正的]最佳实践?
这将根据具体情况而有所不同,但是我认为可以肯定地说,将您的数据库处理程序存储在会话中并不是一个好的做法(额外的内存使用,不需要真正保存它等等)。
你应该看看依赖注入,在这里阅读。这将使单元测试更容易。但请不要将其存储在会话中。请。
我曾经像这样将数据库类创建为单例。不是每个人都喜欢这种方法,但它便于包装。
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 中,则会抛出此错误:
致命错误:在 ...