我终于开始从程序PHP转换为OO PHP,从mysql_XXX转换为mysqli。我有一个关于mysqli和OOPHP的快速问题。假设我创建了一个新的mysqli对象,并希望在不同的页面上使用该对象来访问数据库。将创建的对象放入会话变量
是最佳做法$_SESSION['dbSession'] = new mysqli('host','user','pass','database');
我可以传球,还是我应该遵循其他一些[真正的]最佳做法?
答案 0 :(得分:0)
这将根据具体情况而有所不同,但我认为可以肯定地说,在会话中存储db处理程序并不是一种好的做法(额外的内存使用,不需要真正保存等等。)。
你应该看一下依赖注入,read here。这将使单元测试更容易。但是请不要将它存储在会话中。请。
答案 1 :(得分:0)
我曾经像这样创建一个数据库类作为Singleton。不是每个人都喜欢这种方法,但它很方便包装。
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
}
}
显然会传递配置数据,而不是,这只是一个psudo-summary。您可以使用该类,如:
$myDb = Database::getInstance();
这将在每个单独的请求上重新创建数据库连接,但如果您在单个请求中进行多个查询,则会重复使用相同的连接。
至于将您的MySQLi对象存储在SESSION中,它将无法正常工作。您 允许序列化对象并将它们放在$_SESSION
中,但有些对象是特殊的,故意不允许它。例如,如果您尝试序列化要存储在SESSION中的PDO对象,则会抛出此错误:
致命错误:未捕获的异常'PDOException',消息'您无法序列化或反序列化PDO实例'...