我在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
答案 0 :(得分:0)
您的代码基于错误的前提:您可以从PHP构造函数返回不同的对象。恰恰相反:PHP 完全忽略构造函数的返回值。
这是实际发生的事情。
代码调用时:
$session = new DbSession();
$firstTime == false
检查运行,意味着getInstance()
被调用。
getInstance
找不到现有实例,因此会调用setup()
。
setup()
再次调用new DbSession()
,这次传入的参数阻止了对getInstance()
的另一次调用。它创建对象,将其注册为会话处理程序,然后返回它。
getInstance
将对象推入静态变量,然后将其返回到原始构造函数调用。然后,原始构造函数调用将现有对象放在地面上并返回其自身的全新副本。
你可以通过永远不在setup
/ getInstance()
之外实例化对象来修复一些这种精神错乱。尝试使构造函数受到保护,只调用getInstance()
。
然而,这些都没有解释为什么代码会为您造成故障。事实上,我们也无法解释它。我们缺少所有其余代码,包括您正在使用的数据库适配器,您正在使用的ORM(或者即使您 使用ORM,你的类和方法名称表明它,可能涉及的框架等等。
尝试从课程中剪切实际数据库的所有。只需在磁盘上写文件。首先获取 ,然后介绍数据库层。有可能你的错误会在那时变得明显。