作者showsky (不是我的天空)
看板PHP
標題Re: [請益]物件的傳遞??
時間Sun Nov 23 22:45:41 2008
※ 引述《foxzgerald (Algorithms)》之銘言:
: ※ 引述《showsky (不是我的天空)》之銘言:
: : 找了很多文章都沒寫到
: : 自己也實作了,可是出了點問題,想在這邊問問
: : 就是我在 A 頁面生成了物件 用
: : $_SESSION['dbase'] = serialize($class);
: : 之後再B頁面
: : $class = unserialize($_SESSION['dbase']);
: : 然後可以進行物件的 var 取值這沒問題 普通的method 沒問題
: : 問題在於我的
: : $class 物件 有一個
: : $this->db = new mysqli()
: : 來做 $this->db->query()
: : 沒做傳遞下測試都正常
: : 可以用了SESSION傳遞就出問題了
: : 錯誤代碼
: : Warning: mysqli::query() [function.query]: Couldn't fetch mysqli in
: : XXXXXXXXXXXXXX on line 48
: : 這是為什麼@@ 不解
: : 還是說我方法使用錯誤了
: : 謝謝
: 我剛用以下的程式碼試了一下:
: # FILE 1.php
: -------------------------------------------------
: <?php
: session_start();
: class DBConnector
: {
: function _construct() {
: $this->db = new mysqli("localhost", "root", "0000", "test");
: }
: }
: $db =& new DBConnector();
: var_dump($db);
: $_SESSION['obj'] = serialize($db);
: ?>
: <a href="2.php">2</a>
: ---------------------------------------------------
: # FILE 2.php
: ---------------------------------------------------
: <?php
: session_start();
: var_dump(unserialize($_SESSION['obj']));
: ?>
: ---------------------------------------------------
: 發現一個很有趣的現象:
: 1.php dump 出來的是:
: object(DBConnector)#1 (0) { }
: 2.php dump 出來的則是:
: object(__PHP_Incomplete_Class)#1 (1) {
: ["__PHP_Incomplete_Class_Name"]=> string(11) "DBConnector"
: }
: 雖然 2.php unserialize SESSION 傳遞過來的物件,但很明顯的物件的本質改變了:
: 由原本的 DBConnector 變成了 __PHP_Incomplete_Class_Name 自然會有問題。
: 然後我 google 了一下 __PHP_Incomplete_Class_Name,
: 發現了以下的資訊(來源: http://tinyurl.com/6njskr )
: When an object is unserialized and its class definition doesn't exist
: it becomes an instance of "__PHP_Incomplete_Class".
: 簡單的說..是因為類別的定義(本例中為 class DBConnector)在 2.php 不存在
: 所以 unserialize 時會發生異常.
: 解決的方法很簡單. 那便是在 1.php 和 2.php 中分別 include 類別的定義
: 如此便能正確 unserialize ,例如:
: <?php // 1.php
: session_start();
: include 'class.DBConnector.php';
: $db =& new DBConnector();
: var_dump($db);
: $_SESSION['obj'] = serialize($db);
: ?>
: <?php // 2.php
: session_start();
: include 'class.DBConnector.php';
: var_dump(unserialize($_SESSION['obj']));
: ?>
: <?php // class.DBConnector.php
: class DBConnector {
: public function __construct(){$this->db =& new mysqli(); }
: }
: ?>
: 這樣 dump 出來的東西都是正常的..
: 您可以試試看能不能 work :)
剛剛努力下我發現了解決辦法....
你那方法 我用了雖然dump出來是一樣的
可是執行還是會出現問題
不知道為什麼我就是因為這樣找了超久
所以我使用了
function __sleep(){
return array( 序列化要傳遞的屬性 )
}
function __wakeup(){
$this->conncet();
}
function conncet(){
$this->db = new mysqli( );
}
反序列化後 資料庫相關指令又可以用了
不然一值說沒有這指令的錯誤..
------------------------------------------
不過現在又出現個問題 類別中我有個 var $id = array()屬性
function save($a){
...................
array_push($this->id,$a);
}
執行N次method 陣列就是N個
不過在相同頁面下測試使用 session_start() 進行序列 反序列傳遞之後print_r()
陣列數是正確的....可是在不同頁面傳遞間
執行N次 save method 陣列怎樣都是只有一筆
在 __sleep 有設定序列 $id
又想破頭了~"~ 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.62.124.117
推 foxzgerald :奇怪..我可以ㄝ = ="(而且沒用 sleep和 wakeup也行@@ 11/23 23:32
→ showsky :是喔 好奇怪><" 11/23 23:44