Jean
1

Такая проблема как __PHP_Incomplete_Class_, которая возникает при десериализации.

22.07.2010, 09:45. Показов 1289. Ответов 9
Метки нет (Все метки)

есть такая проблема как __PHP_Incomplete_Class_, которая возникает
при десериализации.
Я нашел решение этой проблемы использовав функцию unserialize_callback_func, и там делаю Include, зато теперь возникает такая проблема как 'cannot redeclare class ....', можно было бы использовать инструкцию include_once или require_once, но тогда не проходит десериализация

Если кто сталкивался с такой проблемой, то подскажите как избавились
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2010, 09:45
Ответы с готовыми решениями:

Возникает исключение при десериализации
Здравствуйте. Решил заняться изучением C# и столкнулся с проблемой. При десериализации классов...

При построении графиков возникает вот такая ошибка
Доброго времени суток. У меня возник следующий вопрос.. Работаю в MathCad 15.0 и при построении...

При копировании(переброски) видео файлов с диска С на УСБ хард возникает такая ошибка
Доброе время суток Уважаемые дамы и господа! у меня проблемы! весь интернет облазил нашёл вас и...

Подскажите пожалуйста в чем возникает проблема при импорте модуля
Добрый день, нуждаюсь в помощи. Начал не так давно изучать python и сделал для себя небольшой...

9
0 / 0 / 2
Регистрация: 20.07.2010
Сообщений: 52
22.07.2010, 10:53 2
unserialize_callback_func - это не функция, а одна из опций php.ini
как у вас применяется она?
0
Jean
22.07.2010, 12:31 3
ini_set('unserialize_callback_func','mycallback');

function mycallback($classname) {

include '....';
}
Jean
22.07.2010, 12:32 4
собственно везде в хелпах так и советуют её использовать
0 / 0 / 2
Регистрация: 20.07.2010
Сообщений: 52
22.07.2010, 13:56 5
а где потом и как применяется данная функция, поскольку ошибка говорит о том, что класс пытаются переопределить, что может говорить о многократном использовании функции mycallback, если уж на то пошло, то использовать её нужно так:

Код
classa.php
  <?
    class A {
      var $title = 'class A';  
      function show_title () {
        echo $this->title;
      }
    };
  ?>
classb.php
  <?
    class B {
      var $title = 'class B';
      function show_title () {
        echo $this->title;
      }
    };
  ?>
callback_func.php
  <?
    function mycallback ($classname) {
      include ($classname);
    }  
  ?>
unserialize.php
  <?
    include ('callback_func.php');

    ini_set ('unserialize_callback_func', 'mycallback');
    mycallback ('classA.php');

    $sA = 'O:1:'a':1:{s:5:'title';s:7:'class A';}'
    $a = unserialize ($sA);
    $a->show_title ();
    echo '
';

    mycallback ('classB.php');
    $sB = 'O:1:'b':1:{s:5:'title';s:7:'class B';}'
    $b = unserialize ($sB);
    $b->show_title ();
    echo '
';
  ?>
из вашего же кода не понятно, что конкретно вы подключаете, но явно не файл с классом $classname
0
Jean
22.07.2010, 14:21 6
вообще внутри mycallback() я подключал все необходимые мне файлы,
потому что эта функция вызывается автоматически при десериализации
и параметром туда передается имя Класса, по нему я никак не могу узнать какой файл подключать.(хотя в принципе можно сделать чтобы по имени класса легко находить имя файла)

Да и даже если ваш способ сработает, мне может несколько раз потребоваться десериализовать один и тот же нужный класс - и проблема то все равно возникнет. - я несколько раз буду подключать один и тот же файл
0 / 0 / 2
Регистрация: 20.07.2010
Сообщений: 52
22.07.2010, 14:33 7
во-первых, функция вызвается перед десериализацией,
во вторых, в неё передаётся имя класса только для смысловой нагрузки
в третьих, даже если понадобится 100 раз десериализовать один и тот же нужный класс, всё равно подключение файла с определением этого класса происходит один раз, ведь перед каждым применением функции я не пишу include.
а из ваших слов я понял, что вы применяете mycallback несколько раз с одними и теми же параметрами, отсюда и вытекающие последствия
по моей схеме проблем ни с чем возникнуть не может
0
Jean
22.07.2010, 14:58 8
ну может я туплю, но сам я функцию mycallback() не вызываю. Она вызывается автоматически - в этом я точно уверен.
И если я 100 раз буду десериализовывать один и тот же класс, эта функция вызовется сто раз, и сто раз подключит один и тот же файл
сам же я ее вызвать не могу, потому что точно не знаю, какой именно класс сейчас будет десериализовываться

небольшая ремарка
на самом деле, я вытаскиваю класс из сессии, но как я заметил он лежит там в сериализованном виде. ну и проблемы возникают те же, что и при простой десериализации
0 / 0 / 2
Регистрация: 20.07.2010
Сообщений: 52
22.07.2010, 15:18 9
без разницы откуда вытаскивать класс, а за место сессий раньше использовалась сериализация, и сессии на основе неё сделаны, только сессии необходимы для защиты данных, чтобы ни одна св... не догадалась как файл называется.
короче, аська есть?
0
Jean
22.07.2010, 15:32 10
173156899
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2010, 15:32

Почему возникает такая ошибка?
Это приложение работает так: 1)вводиться текст в первое текстовое поле; 2) нажимается кнопка...

При сохранении битмапа возникает такая ошибка: "В GDI+ возникла ошибка общего вида"
помогите пожалуйста при сохранении битмапа возникает такая ошибка: &quot;В GDI+ возникла ошибка общего...

При установки с диска любой игры или програмы возникает проблема.
При установки любой игры или программы пишет&quot;файл поврежден или не хватает места&quot;.пробовал...

Исправить ошибку, которая возникает при выполнения запроса (SqlCom.ExecuteNonQuery())
Работаю с бд Access первый раз! Помогите исправить ошибку которая возникает при выполнения запроса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.