我已经创建了用于处理会话的此类:
# app/src/sessionHandler.php
<?php
namespace src;
class sessionHandler
{
protected $_session;
public function __construct()
{
session_start();
$this->_session = $_SESSION;
}
public function getSession()
{
return $this->_session;
}
public function getSessionVar($key)
{
return $this->_session[$key];
}
public function setSessionVar($key, $value)
{
try {
$this->_session[$key] = $value;
} catch (\Exception $e) {
require_once $_SERVER['DOCUMENT_ROOT']. '/app/src/errHandler.php';
$errHandler = new errHandler(5, $e->getMessage());
$errHandler->logErr();
}
}
public function unsetSessionVar($key)
{
unset($this->_session[$key]);
}
public function destroySession()
{
session_destroy();
}
}
我在这里可以使用page1.php:
# app/build/page1.php
<?php
require_once $_SERVER['DOCUMENT_ROOT']. '/conf/env.php';
require_once DOC_ROOT. '/conf/loader/class.php';
$varHandler = new \src\varHandler;
$sessionHandler = new \src\sessionHandler;
$sessionHandler->setSessionVar('foo', 'bar');
$foo = $sessionHandler->getSessionVar('foo');
$varHandler->dumpVarR($foo);
此输出:
倾销:foo
酒吧
符合预期。在page2.php上,我尝试相同的操作(没有设置):
# app/src/build/page2.php
<?php
require_once $_SERVER['DOCUMENT_ROOT']. '/conf/env.php';
require_once DOC_ROOT. '/conf/loader/class.php';
$sessionHandler = new \src\sessionHandler;
$session = $sessionHandler->getSession();
$foo = $sessionHandler->getSessionVar('foo');
$varHandler = new \src\varHandler;
$varHandler->dumpVarR($foo);
$varHandler->dumpVarR($session);
输出:
注意:未定义的索引:第21行的/var/www/foundations/app/src/sessionHandler.php中的foo
倾销:foo
倾销:_GET
数组
(
)
我不明白为什么会出错-不能是/var/lib/php/session
权限错误,因为page1.php可以将会话值设置得很好。 Page2似乎无法链接到同一会话。这样做:
$sessionHandler->setSessionVar('foo2', 'bar2');
$foo2 = $sessionHandler->getSessionVar('foo2');
$varHandler->dumpVarR($foo2);
在page2上工作,我可以看到bar2设置为foo2。我在做什么错了?
答案 0 :(得分:0)
答案与我的课堂有关,尤其是这一行:
$this->_session = $_SESSION;
如果我理解正确,那么它在__construct
中所做的并不是我所期望的。每次启动会话时,它将$this->_session
重新声明为新的$_SESSION
-覆盖每个页面上的数据。
我通过将班级更改为:
<?php
namespace src;
class sessionHandler
{
protected $_sessionId;
public function __construct()
{
if (!isset($_SESSION)) {
$this->init();
}
}
public function init()
{
session_start();
$this->_sessionId = session_id();
}
public function getSessionVar($key)
{
return (isset($_SESSION[$key]) ? $_SESSION[$key] : 'no data found in session for key: '. $key);
}
public function setSessionVar($key, $value)
{
try {
$_SESSION[$key] = $value;
} catch (\Exception $e) {
require_once $_SERVER['DOCUMENT_ROOT']. '/app/src/errHandler.php';
$errHandler = new errHandler(5, $e->getMessage());
$errHandler->logErr();
}
}
public function unsetSessionVar($key)
{
if (isset($_SESSION[$key])) {
unset($_SESSION[$key]);
} else {
return false;
}
return true;
}
public function destroySession()
{
try {
session_destroy();
} catch (\Exception $e) {
require_once $_SERVER['DOCUMENT_ROOT']. '/app/src/errHandler.php';
$errHandler = new errHandler(5, $e->getMessage());
$errHandler->logErr();
}
}
}
,因此它使用已经存在的$_SESSION
数据。现在page2可以看到page1上声明的内容。