(PHP4) Самосохранение объекта в сессии

pamir
Дата: 05.07.2006 01:31:36
Знатоки, подскажите, я использую что-то недокументированное или это нормально?
Задача - передавать объект от скрипта к скрипту. Использую сессии. Чтобы не писать в каждом скрипте в сессию решил попробывать упихать это в сам объект. Получил следующее (все имена переменных вымышлены):
class my_class
{

  //
  // Constructor
  //
  function my_class()
  {
    $this->a = 1;
    $this->b = 10;
    if (isset($_SESSION["session_str"])) {
      $ser=$_SESSION["session_str"];
      $this=unserialize($ser); // Удивило, что это сработало.
    } else {
      $this->c=100;
    }
    return true;
  }

  function save_myself()
  {
    $_SESSION["session_str"]=serialize($this);
    return true;
  }
  function some_function()
  {
    /*
    тут что-то делается. А потом сохраняется
    */
    $this->save_myself();
    return true;
  }
Удивила выделенная строка. Есть сомнения, что я прав, хотя и работает.
*
Дата: 05.07.2006 07:26:27
http://php.net/language.oop.serialization
PS: до тех пор, пока ты не догадаешься сериализовать ресурсы, работать будет.
*
Дата: 05.07.2006 07:28:27
*
до тех пор, пока ты не догадаешься сериализовать ресурсы, работать будет.
http://php.net/ref.session
http://php.net/ref.session
Some types of data can not be serialized thus stored in sessions. It includes resource variables or objects with circular references (i.e. objects which passes a reference to itself to another object).
pamir
Дата: 03.08.2006 11:11:21
Здравствуй.... пятый пхп...

У хостера оказался PHP5
и на выделенной в первом посте строке получаю
Fatal error: Cannot re-assign $this in ...

Где-то в англоязычном инете нашел совет, перед присвоением сделать
unset($this).
Проверить на 5м было некогда. на четверке в итоге получался пустой экземпляр класса (т.е. сразу после присвоение вроде все хорошо, а когда я этот класс использую, у него все значения - начальные, а не прописанные).

Еще нашел в рунете вариант обхода
$var="this";
$$var=<то, что нужно>.
Тоже не проверил - это только вечером дома.

Хотел бы услышать, может существуют правильные решения? У меня на этом классе много чего завязано...
pamir
Дата: 03.08.2006 20:20:36
не помогли оба варианта :о(
Неужели нет больше возможности?
pamir
Дата: 04.08.2006 00:23:41
А вот и решение. Вместо выделенной строки пишем
      $tmp=unserialize($ser);
      foreach($tmp as $key => $val) {
        eval("\$this->\$key = \"$val\";");
      }
*
Дата: 04.08.2006 00:43:15
pamir
А вот и решение.
И нафига там eval, от которого может быть уйма проблем в плане безопасности?
$this->{$k} = $v;
*
Дата: 04.08.2006 00:44:20
Ссылку забыл. http://php.net/variables.variable
PS: тоже использовать там, где этого ненужно, не следует.
pamir
Дата: 04.08.2006 00:53:47
*
pamir
А вот и решение.
И нафига там eval, от которого может быть уйма проблем в плане безопасности?
$this->{$k} = $v;

Патамучта я ПХП не твердо знаю.
Спасибо :)