Temat: przestrzeń nazw sesji i przepływ informacji miedzy...
Witam,
Zastosuj w kontrolerach ten sam namespace:
class TestController extends Zend_Controller_Action
{
protected $_testSession;
public function init()
{
$this->_testSession = new Zend_Session_Namespace('testNamespace');
}
}
class Test2Controller extends Zend_Controller_Action
{
protected $_test2Session;
public function init()
{
$this->_test2Session = new Zend_Session_Namespace('testNamespace');
}
}
lub utwórz obiekt reprezentujący namespace użyty w innym kontrolerze:
class TestController extends Zend_Controller_Action
{
protected $_testSession;
public function init()
{
$this->_testSession = new Zend_Session_Namespace('testNamespace');
}
}
class Test2Controller extends Zend_Controller_Action
{
protected $_testSession;
protected $_test2Session;
public function init()
{
$this->_testSession = new Zend_Session_Namespace('testNamespace');
$this->_test2Session = new Zend_Session_Namespace('test2Namespace');
}
}
---
Zend_Session::destroy(true); niszczy dane w sesji ($_SESSION) ale nie usuwa ich obiektowych reprezentacji czyli obiektów Zend_Session_Namespace. Dodanie true jako drugiego argumentu:
Zend_Session::destroy(true, true);
zabezpiecza resztę kodu przed powołaniem kolejnych obiektów Zend_Session_Namespace.
Jeśli chcesz mieć pewność, że dalszy kod nie odczyta danych sesyjnych zgromadzonych w ich obiektowych reprezentacjach możesz wymusić usunięcie wszystkich obiektów Zend_Session_Namespace, co możesz wykonać tuż przed wywołaniem destroy();
foreach (Zend_Session::getIterator() as $namespace) {
Zend_Session::namespaceUnset($namespace);
}
Zend_Session::destroy(true, true);
Musisz jednak pamiętać, że w PHP5 istnieją wskaźniki a namespaceUnset() nie przeprowadza operacji głębokiego usuwania zmiennych, co za tym idzie jeśli przechowasz w sesji obiekt do którego posiadasz wskaźnik to namespaceUnset usunie tablicę w sesji ale obiekt znajdujący się w niej nadal będzie dostępny poprzez istniejącą referencję.
--
PS: Istnieje tylko jedna sesja ;) Obiekty Zend_Session_Namespace to tylko obiektowe reprezentacje danych należących do tej samej sesji.
Rafał Gałka edytował(a) ten post dnia 29.06.08 o godzinie 18:21