我正在使用PHP的第三方COM对象,我希望将对象保存在会话变量中,以便在将来的服务器调用中访问它。
如果我在会话中保存对象:
$_SESSION['collItem'] = $collItem;
我可以在定义后立即通过$_SESSION['collItem']
访问它的方法和属性。
但是,在将来调用服务器时,如果我尝试使用$_SESSION['collItem']
,我就无法再次访问它。
我在这里写了一些代码来澄清。
在我的脚本“functions.php”中启动COM对象的方法:
public function setAppData() {
try {
$appD = new COM('ASData.CASDataApp');
$appD->InitMasterData(true, 1, 91);
$appD->DateMask = 'ymd';
$_readDB = $appD->InitApp($this->readDB());
} catch (Exception $e) {
$err = 'Connection error: ' . htmlentities(addslashes(strip_tags($e->getMessage())));
$this->setError($err);
return false;
}
$appD->appPath = str_replace('\app\include', '', __DIR__);
$this->iniciarCollections($appD);
$this->appData = $appD;
}
从我的脚本“edit_json.php”调用方法:
require_once('functions.php');
if (!session_id()) {
session_start();
}
// We recover $mbw object saved in session and initialize COM object
if (isset($_SESSION['mbw'])) {
$mbw = unserialize($_SESSION['mbw']);
}
$mbw->setAppData();
$appData = $mbw->getAppData();
$_SESSION['appData'] = $appData;
如果我在COM初始化后立即尝试访问$ _SESSION ['appData']我可以毫无问题地使用它,但是如果我在将来的服务器调用中尝试下一个代码(在$ _SESSION ['appData']中保存$ appData对象:
if (!session_id()) {
session_start();
}
$appData = $_SESSION['appData'];
// I can't work with $appData object if I don't initialize it again
重新初始化COM对象对我来说不是一个好的解决方案,因为我丢失了所做的所有更改。
答案 0 :(得分:6)
在脚本开头使用session_start()
。您需要它来从服务器检索会话数据到$_SESSION
变量。
来自http://php.net/manual/en/function.session-start.php:
session_start()根据通过GET或POST请求传递的会话标识符创建会话或恢复当前会话,或通过cookie传递。
答案 1 :(得分:1)
您应该编辑问题并包含getAppData()
方法,以便我们进行更好的诊断。但我可以猜到你的getAppData()
会返回一个对象,在这种情况下,当你有一个像
$appData = $mbw->getAppData();
$_SESSION['appData'] = $appData;
PHP正在做的是$_SESSION['appData']
仅将引用保存到$mbw->getAppData()
对象,而不是真实对象。
如果要将真实对象存储在会话中,则必须执行以下操作:
$_SESSION['appData'] = serialize($appData);
然后,只要你想使用存储的对象,你就可以:
if (isset($_SESSION['appData'])) $appData = unserialize($_SESSION['appData']);
关于使用会话中保存的$ appData的每个文件的开始。