За последние 24 часа нас посетили 16862 программиста и 1298 роботов. Сейчас ищут 1432 программиста ...

почему объект виден не во всех обработчиках сессий?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Олег, 26 июл 2010.

  1. Олег

    Олег Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    4
    Симпатии:
    0
    Добрый день
    Я переопеределил обработчики сессий и в них использую глобальный эклемпляр объекта для реализации работы с БД.
    Глобальный объект виден в открытии сессии, чтении данных, но почемуто не виден в записи и в закрытии сессии.
    Аналогичная скалярная глобальная переменная, видна из всех обработчиков сессий.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это как?
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    [vs] насколько я понял у него так

    PHP:
    1. <?php
    2. functon saveHandler()
    3. {
    4.   global $db;
    5. }

    Олег
    по всей видимости к момету записывания данных инстанция уже уничтожена сборщиком мусора
     
  4. Олег

    Олег Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    4
    Симпатии:
    0
    Да, пример верный. Так вот если $db скалярная переменная, она успешно видна во всех процедурах, переопределяющих работу сессий. А если $bd объект, то он виден в процедурах открытия и чтения, но недоступен в процедурах записи и закрытия сессии, сборщик еще не должен порубить переменные. Да и чем в плане сборщика скаляр от объекта отличается, уничтожаютсято они в один заход сборщика.
    Проблема проявляется на php 5.2.4, но этот же код работал ранее на версиях 5.0.... (типа 5.0.4)
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    а?
     
  6. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Пробуйте читать документацию - помогает.
     
  7. Олег

    Олег Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    4
    Симпатии:
    0
    Вот раскопал в доках.
    Write and Close handlers are called after destructing objects since PHP 5.0.5. Thus destructors can use sessions but session handler can't use objects. In prior versions, they were called in the opposite order. It is possible to call session_write_close() from the destructor to solve this chicken and egg problem.
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    вот приятно же наверно самому докопаться до описания почему так происходит?
     
  9. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    Koc
    ага, щас попросит перевести :D