2012-01-16 48 views
0

我遇到了在PHP中實現自定義會話處理程序的問題。 代碼: http://pastebin.com/9QV9f22Q在PHP中使用分隔符自定義會話處理程序

我在框架初始化一次自舉,我有一個數據庫連接後:

require_once 'DbSession.php'; 
$session = new DbSession(); 
session_start(); 

但我不能查看我的網頁。 Firefox得到302狀態並顯示「找不到服務器」錯誤。 Firebug說,內容長度爲5K,但我無法查看頁面。

一個重裝後登錄: http://pastebin.com/JYe14nGR

我不知道爲什麼它仍然是「失去」創建DbSession實例。你有什麼想法嗎? TIA

回答

0

你的代碼是基於一個錯誤的前提:你可以從PHP構造函數返回一個不同對象。恰恰相反:PHP 完全忽略了來自構造函數的返回值

下面是實際發生的情況。

當代碼調用:

$session = new DbSession(); 

$firstTime == false檢查運行,這意味着getInstance()被調用。

getInstance找不到現有實例,因此它調用setup()

setup()再次調用new DbSession(),這次傳遞的參數阻止了另一個調用getInstance()。它創建對象,將其註冊爲會話處理程序,並將其返回。

getInstance將對象推入靜態變量中,然後將其返回給原始構造函數調用。最初的構造函數調用然後將現有對象放置在地面上並返回其自身的全新副本。

你可以永遠實例的setup/getInstance()外的物體解決這個瘋狂的一些。嘗試使構造函數受到保護,並且只調用getInstance()

但是,這些都沒有解釋爲什麼代碼出現故障。事實上,我們也無法解釋它。我們錯過了所有其他的代碼,包括你使用的數據庫適配器,你使用的是什麼ORM(或者你的使用ORM,你的類和方法名稱暗示它),什麼框架可能涉及,等等。

嘗試切割所有的實際數據庫從類觸摸。只需在磁盤上寫入文件。首先得到,然後引入數據庫層。很可能你的錯誤在那個時候會變得很明顯。

相關問題