2011-09-14 33 views
0

我在會話中存儲對象時有點問題。根據我的理解,如果這個類是可序列化的,並且在調用session_start()之前包含它,php會自動序列化/反序列化對象。試圖避免序列化在PHP與qcodo

在接下來的例子(使用qcodo 0.4.22 framework)我不能恢復對象的值:

require(dirname(__FILE__) . '/../includes/prepend.inc.php'); 
QApplication::QcodoInfo(); 

if (!isset($_SESSION["person"])) { 
    $person = Person::LoadById(1); 
    $_SESSION["person"]=$person; 
} 
else { 
    echo "Hello ".$_SESSION["person"]->FirstName; 
} 

所以,爲了工作,我不得不做的事:

require(dirname(__FILE__) . '/../includes/prepend.inc.php'); 
QApplication::QcodoInfo(); 

if (!isset($_SESSION["person"])) { 
    $person = Person::LoadById(1); 
    $_SESSION["person"]=serialize($person); 
} 
else { 
    echo "Hello ".unserialize($_SESSION["person"])->FirstName; 
} 

由於沒有-qcodo類我不需要使用序列化。 是否可以避免序列化?

+0

哪一類是'Person'? – hakre

+0

這是從Qcodo網站的示例數據庫中提取的「表類」。我只想說明在沒有序列化的情況下在會話中存儲對象的不可能性 – yauros

+0

該表類是否具有特定的具體名稱?也許可以在http://api.qcodo.com/上看到的東西?我只是想了解具體情況。在將它存儲到會話中時,處理具體實例時遇到問題已經很清楚了。 – hakre

回答

1

感謝您的providing the link to the forums。你在那裏放置了一個非常重要的信息:

When the object is in the session i get the error: 「The script tried to execute a method or access a property of an incomplete object.」

這意味着,在反序列化會話時,類定義尚未加載。非序列化在session_start完成。所以首先加載所有的類定義,然後開始會話。有用的在這方面是:

所以,試圖找出其中像會話得到啓動。也許您只需稍後啓動它,PHP手冊中包含有關會話的更多信息,以及如何在啓動時進行配置,可以選擇自動啓動會話,也許您會遇到這種情況,但這只是一個假設,還有更多需要配置的功能,而且我不太流利Qcodo如何加載類。

0

謝謝!我更接近您的評論的解決方案。

縱觀qcodo核心,我看到會話被初始化的地方.....並且在包含類之前完成。

問題是這個類包含在我打電話的那一刻(這怎麼可能?)。我在類文件中寫了一個echo語句,並且在我使用該類的那一刻出現了回顯。爲此,我不知道何時調用session_start()來解決問題。

編輯:我發現了PHP中的「自動加載」功能。是不是?所以我的問題是,如果有可能保持自動加載,並在正確的時刻開始會議

EDIT2:我終於找到了解決方案。在qcodo論壇上,我提供了幾個選項。最後,我必須在qcodo調用session_start函數之前包含數據類。 Thx to everyone

+0

如果可以,請添加一些代碼,你如何做到了你的答案並接受這個問題的答案被標記爲解決。謝謝!很高興你能解決它! – hakre