пытаясь избежать сериализации в php с qcodo - PullRequest
0 голосов
/ 14 сентября 2011

У меня небольшие проблемы при хранении объектов в сессии.Согласно тому, что, я думаю, я понял, если класс сериализуем и вы включаете его перед вызовом session_start(), php автоматически сериализует / десериализует объект.

В следующем примере (используя qcodo 0.4.22 framework) я не могу восстановить значение объекта:

require(dirname(__FILE__) . '/../includes/prepend.inc.php');
QApplication::QcodoInfo();

if (!isset($_SESSION["person"])) {
    $person = Person::LoadById(1);
    $_SESSION["person"]=$person;
}
else {
    echo "Hello ".$_SESSION["person"]->FirstName;
}

Итак, чтобы работать, я вынужден сделать:

require(dirname(__FILE__) . '/../includes/prepend.inc.php');
QApplication::QcodoInfo();

if (!isset($_SESSION["person"])) {
    $person = Person::LoadById(1);
    $_SESSION["person"]=serialize($person);
}
else {
    echo "Hello ".unserialize($_SESSION["person"])->FirstName;
}

С классами no-qcodo iне нужно использовать сериализацию.Можно ли избежать сериализации?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Спасибо за предоставление ссылки на форумы . Вы положили туда очень важную информацию:

Когда объект находится в сеансе, я получаю сообщение об ошибке: «Сценарий попытался выполнить метод или получить доступ к свойству незавершенного объекта».

Это означает, что во время десериализации сеанса определения классов еще не загружены. Десериализация выполняется на session_start. Поэтому сначала загрузите все определения классов, а затем начните сеанс. В этом контексте полезны:

Так что постарайтесь выяснить, в каком случае начинается сессия. Может быть, вам нужно только запустить его позже, руководство по PHP содержит больше информации о сессиях в целом и о том, как настроить при запуске, есть опция для автоматического запуска сессий, возможно, вы столкнулись с этим, но это только предположение , есть еще что настроить, и я не знаю, как Qcodo загружает классы.

0 голосов
/ 15 сентября 2011

Спасибо !.Я ближе к решению с вашим комментарием.

Глядя в ядро ​​qcodo, я вижу место, где инициализируется сессия ..... и это делается до включения классов.

ПроблемаЭто то, что класс включен в момент, когда я звоню по нему (как это возможно?).Я написал предложение эха в файле класса, и это эхо появляется в тот момент, когда я использую класс.Для этого я не знаю, когда вызывать session_start () для решения проблемы.

РЕДАКТИРОВАТЬ: я обнаружил функцию "автозагрузки" в php.Разве для этого нет?Поэтому мой вопрос: возможно ли сохранить автозагрузку и начать сеанс в нужный момент

EDIT2: я наконец нашел решение.На форумах qcodo мне предложили несколько вариантов.Наконец, мне пришлось включить классы данных, прежде чем qcodo вызовет функцию session_start.Спасибо всем

...