2011-07-08 89 views
1

也許我只是沒有看到它,但有沒有其他方式可以訪問先前創建的會話名稱空間,而不是直接調用$_SESSION?除了這個事實,我真的不想這樣做,Zend的文檔還advises against this跨多個請求使用Zend會話命名空間

而$ _SESSION仍處於 PHP的全局命名空間,開發商 應該直接訪問 它避免,這樣Zend_Session和Zend_Session_Namespace可以最有效地安全地提供其 套件的會話相關的 功能。

給Zend_Session_Namespace類沒有爲獲得一個命名空間的靜態方法,雖然Zend_Session中現已棄用namespaceGet方法指示我使用Zend_Session_Namespace#getIterator,這種方法也不是一成不變的。

這意味着我需要使用關鍵字new來初始化一個新的名稱空間。問題是,這並不包括先前設定的變量:

$ns = new Zend_Session_Namespace('foo'); 
$ns->foo = 'bar'; 

在隨後的請求,這一點:

print_R(new Zend_Session_Namespace('Foo')); 

...打印此:

Zend_Session_Namespace Object 
(
    [_namespace:protected] => Foo 
)  

這似乎是顯而易見的。

那麼我該如何獲取以前創建的命名空間,而不使用$_SESSION['Foo']

+0

Tim已經回答了這個問題:使用'new'運算符。既然你似乎在尋找一個'static'方法:afaik沒有,但是當然你可以自由地編寫你自己的靜態工廠單例,如果你想避免有幾十個新的Zend_Session_Namespace()聲明傳播在你的代碼上。 –

回答

6

您的兩個代碼示例的情況不匹配(foo vs. Foo),我不確定這是否僅僅是一個錯字。 Zend_Session_Namespace只是$ _SESSION的一個包裝,所以你只需要用相同的鍵創建一個名稱空間對象,然後你所有的數據都可以使用。

$ns = new Zend_Session_Namespace('foo'); 
$ns->foo = 'bar'; 

,然後在另一頁:

$ns = new Zend_Session_Namespace('foo'); 
echo $ns->foo; // should output bar 

如果不工作,然後有一個與你的會話配置的問題。

+0

案件的錯誤確實是一個錯字。但我錯了,雖然'print_r'沒有顯示它們,但訪問屬性實際上是有效的。必須在它太久我想...很抱歉浪費你的時間! –

+1

print_r可能會引起誤解,因爲數據仍存儲在$ _SESSION中(所以print_r時不會顯示),命名空間類只是從那裏訪​​問它。 –

+0

要爲Zend_Session_Namespace()導入什麼? –