【发布时间】:2013-12-10 17:42:01
【问题描述】:
我知道 PDO 不能序列化为会话,我可以使用单例,通过实例化访问 PDO,如本例 Use of PDO in classes。 我已经压缩了代码并删除了异常处理,例如为了 PDO 连接的所有必要细节。
class Database
{
public $db;
private static $instance;
private function __construct()
{
$dsn = 'mysql:dbname=test;host=localhost;port=3306';
$this->db = new PDO($dsn, 'user', 'password');
echo 'You will see this when PDO is created or instantiated';
}
public static function getInstance()
{
if (!isset(self::$instance))
{
$object = __CLASS__;
self::$instance = new $object;
}
return self::$instance;
}
}
然后每个页面或脚本通过使用例如调用静态实例:
$database = Database::getInstance();
$stmt = $database->db->prepare('SELECT * FROM table');
$stmt->execute();
现在这一切都很好,但我的理解是每次调用实例时都会创建一个新的 PDO。有没有办法,不使用框架,例如Zend Registry,从一个页面到另一个页面传递 PDO,而不是每次都创建一个新的 PDO?我似乎找不到这个问题的答案。尽管它是单个实例,但在每个页面上重新连接到数据库似乎仍然是相当多余的。谢谢。
已解决
我认为最终这是PHP的限制,我所要求的实际上无法完成。感谢大家的帮助,不胜感激。
【问题讨论】:
-
在您的情况下,一个新的 PDO 实例每个会话获取一次,而不是每次调用
Database::getInstance()。 -
为什么要返回自己的课程而不是 PDO?
-
@YourCommonSense 吧?如果他显然有一个包装器,他为什么要直接返回一个 PDO 实例?
-
Rain,我没有调用 session_start() 时怎么会这样?
-
@YourCommonSense 他在他的类的构造函数中创建了一个 PDO 实例,这是一个数据库抽象层。因此,也许他不想返回 PDO 的裸实例,而是返回他的类的实例,而后者又通过属性持有 PDO 的实例? (请注意,他表示为简洁起见删除了很多代码)