наследование от ArrayObject и хранении в сессии

Lews

Новичок
наследование от ArrayObject и хранение в сессии

Есть класс, наследованный от ArrayObject.
Создается его экземпляр, проводятся различные махинации. После чего этот экземпляр сохраняется в сессию.
Затем переходим на другую страничку, считываем и сесси и получаем пустой класс .

Если убрать наследования от ArrayObject, то все изменения корректно передаются.
Так и должно быть? Если да, то почему?

Код:
PHP:
session_start();
class user  extends ArrayObject {
	private $_data;
	
	public function __construct(){
	}
	
	public function offsetGet($index){
  	return $this->_data[$index];
  }

	public function offsetSet($index, $newValue){
		$this->_data[$index] = $newValue;
	}	
}

if(isset($_SESSION['user']))
	$user = $_SESSION['user'];
else{
	$user = new user();
	$user->offsetSet('test', 0);
}
	
$user->offsetSet('test',$user->offsetGet('test') + 1);
echo $user->offsetGet('test');
$_SESSION['user'] = $user;
echo '<br><a href="index.php5">move</a>';
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
класс ArrayObject не является потомком StdClass и не содержит стандартные "магические" методы сериализации, надо реализовать их самому:

PHP:
class user  extends ArrayObject implements Serializable {
    public $_data=array();
    
    public function offsetGet($index){
      return $this->_data[$index];
  }
    public function offsetSet($index, $newValue){
        $this->_data[$index] = $newValue;
    }    
    function serialize(){
        return serialize($this->_data);
    }
    function unserialize($data){
        $this->_data=unserialize($data);
    }
}

session_start();


if(isset($_SESSION['user'])){
    $user = $_SESSION['user'];
    echo 'value stored: '.$user['test'];
}else{
    $user = new user();
    $user['test']= 123;
    $_SESSION['user'] = $user;
}
У меня на 5.2.2 это работает

-~{}~ 03.07.07 00:30:

заметьте,
$user['test']++ работать не будет
Notice: Indirect modification of overloaded element of user has no effect
надо писать $user['test']+=1
 

Vallar_ultra

Любитель выпить :)
[offtopic]
Гм, а это просто такой способ разминки мозга или ЭТО зачем-то нужно??? Зачем наследовать класс от ArrayObject (в чем практический смысл)?
[/offtopic]
 

Wicked

Новичок
grigori
разве это не будет правильнее делать через __wakeup/__sleep ?
 
для меня так же остается загадкой этот самый user, зачем в нем этот самый _data ? если класс extends ArrayObject ? афтар не читал ман, или user это просто какой-то пимитивный пример?
Код:
class user extends ArrayObject{}
$foo = new user();
$foo->offsetSet('test', 0);
$bar = serialize($foo);
var_dump($bar); : string(30) "0:5:"user":1:{s:4:"test";i:0;}"
извините если туплю :|
 

Lews

Новичок
Естественно это урезанный до невозможности класс до демонстрации, не выкладывать же весь код :)

Про ++ в курсе.
За совет спасибо - попробую сейчас.

-~{}~ 03.07.07 14:29:

c implements Serializable заработало как надо. Спасибо :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Vallar_ultra
Мне - да, зачем-то нужно бывает. Очень удобно :)

Wicked
__wakeup/__sleep для другого предназначены. Они вызываются "после" и "перед" сериализацией, служат для подготовки самого объекта, например, подключение/отключение с БД. Они не участвуют в обработке самих данных. Sleep только указывает, какие поля надо подвергать сериализации, а wakeup работает с данными, которые уже есть в объекте.
Более того, стандартные __wakeup/__sleep в ArrayObject реализованы и с ними проблем нет.

mishco В мануале нет указания на решение описанной проблемы, я дошел до него методом научного тыка.

-~{}~ 03.07.07 14:40:

Пример использования - объект, в котором сохраняются данные о текущем пользователе и реализуется работа с БД, сессиями и другими источниками.

Вместо того, чтобы хранить user_id и т.п. в отдельных переменных сессии, можно забросить в сессию весь объект, который при старте сессии автоматически подключит интерфейс базы, данные из сессии и классы прочих источников данных, если они есть.
 

Vallar_ultra

Любитель выпить :)
grigori
А не мог бы привести пример "удобства" использования???
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
"Удобство" - понятие субъективное. Субъективно мне описанное выше удобно.
Нет у ООП, MVC, SPL, PDO и вообще любых современных техник безусловных неоспоримых удобств по сравнению с другими стилями и техниками.
Но мне нравится - и я знаю, что флейм на 3 страницы на тему за и против SPL будет очень похож на недавний флейм за и против ООП.

-~{}~ 04.07.07 00:35:

Более того, использование SPL (как и любой другой техники) требует переучиваться, изменять стиль кодирования, переписывать существующий готовый отлаженый код для новых проектов, в которых я стараюсь использовать SPL. Это занимает много сил, времени и, как экономист, понимаю, что это - глубоко неэффективно. Но я ушел из банка в программирование потому что мне это нравится, и SPL я использую по той же самой причине.
 
Сверху