台灣最大程式設計社群網站
線上人數
862
 
會員總數:246038
討論主題:189626
歡迎您免費加入會員
討論區列表 >> PHP >> SESSION中存取物件
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
SESSION中存取物件
價值 : 50 QP  點閱數:1027 回應數:3
樓主

迷路
高級專家
11226 137
7551 1743
發送站內信

捐贈 VP 給 迷路
修改前人留下的程式出現問題
程式將登入資訊放入物件中,然後整個物件存入session中
原程式可以順利的存取物件
但是因為程式開發的時間已經有點久,某些不規範的寫法在當時不會報錯,但是PHP一升級就會冒出一堆問題
一開始出現的問題是session_start()重複宣告的問題,原程式幾乎是到處放......
將session_start提出到網頁最上方後
物件的存取突然出現問題
簡化後的原始碼
e.php

d1.php

d3.php

當然這是超簡化,把登入判斷、登入、登出等等全部寫在一個動作中
但是只輸出111
加入print_r($_SESSION);檢查
Array ( [28552fec-2ed5-791d-c5d9-a9dcad621d5c] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => d1 [dID] => 777 [dName] => Lucky ) )
Google「__PHP_Incomplete_Class Object」找到解決方法
只要調整session_start的位置即可

這樣就能正常存取物件

雖然功能修好了,但是卻是不明所以
網上的文章提到似乎和序列化、反序列化有關,但是根本不明白那是什麼
請教大大提點

搜尋相關Tags的文章: [ session ] , [ 物件 ] , [ 序列化 ] , [ 反序列化 ] ,
本篇文章發表於2015-06-18 18:32
1樓
最有價值解答

香帥
檢舉此回應
請看以下程式碼
d1.php


e1.php


e2.php

e1測試網址在
http://php.a168a.com/session_start/e1.php
e2測試網址在
http://php.a168a.com/session_start/e2.php

php不是採編譯 (Compile),他是直譯 (Interprete)
若require_once dirname(__FILE__)."/d1.php";這行程式碼先
才找得到d1的物件e1就會顯示正確aaa出來(e1測試)
反之則找不到出現錯誤訊息(e2測試)
Fatal error: Class 'd1' not found in C:\php\session_start\e2.php on line 2
您的session_start()也因為require_once dirname(__FILE__)."/d1.php" 有沒放在前面也是同樣道理;
本篇文章回覆於2015-06-19 14:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

皮皮快跑
檢舉此回應
你要不要考慮改使用__autoload這個函式來解決問題?
當物件被使用時就會自動載入宣告的檔案。
不過說真的把物件放到session總覺得不是個很好的做法。

本篇文章回覆於2015-06-19 15:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
感謝香帥大的解釋
沒想到我居然沒注意這麼簡單的問題

皮老大提到的__autoload我會好好研究的
其實我也覺得做成物件存在session中不太妥
只是整個系統的後台改起來工程挺浩大的
再加上又是非必要的修改
對公司而言那就沒必要修改......
本篇文章回覆於2015-06-22 09:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.