使用db的php中的自定义会话处理程序

时间:2012-01-16 15:25:18

标签: php session

我在php中实现自定义会话处理程序时遇到问题。 代码: http://pastebin.com/9QV9f22Q

在我与db:

连接后,我在框架引导程序中初始化了一次
require_once 'DbSession.php';
$session = new DbSession();
session_start();

但后来我无法查看我的页面。 Firefox获得302状态“服务器未找到”错误。 Firebug说内容长达5k,但我无法查看该页面。

重新加载后记录: http://pastebin.com/JYe14nGR

我想知道为什么它仍然“失败”创建了DbSession实例。你有什么想法吗? TIA

1 个答案:

答案 0 :(得分:0)

您的代码基于错误的前提:您可以从PHP构造函数返回不同的对象。恰恰相反:PHP 完全忽略构造函数的返回值。

这是实际发生的事情。

代码调用时:

$session = new DbSession();

$firstTime == false检查运行,意味着getInstance()被调用。

getInstance找不到现有实例,因此会调用setup()

setup()再次调用new DbSession(),这次传入的参数阻止了对getInstance()的另一次调用。它创建对象,将其注册为会话处理程序,然后返回它。

getInstance将对象推入静态变量,然后将其返回到原始构造函数调用。然后,原始构造函数调用将现有对象放在地面上并返回其自身的全新副本。

你可以通过永远不在setup / getInstance()之外实例化对象来修复一些这种精神错乱。尝试使构造函数受到保护,只调用getInstance()

然而,这些都没有解释为什么代码会为您造成故障。事实上,我们也无法解释它。我们缺少所有其余代码,包括您正在使用的数据库适配器,您正在使用的ORM(或者即使您 使用ORM,你的类和方法名称表明它,可能涉及的框架等等。

尝试从课程中剪切实际数据库的所有。只需在磁盘上写文件。首先获取 ,然后介绍数据库层。有可能你的错误会在那时变得明显。