#php #serialization
#php #сериализация
Вопрос:
Это
if(is_object($value)) echo 'AAA';
if(gettype($value)==='object') echo 'BBB'
Выводит ‘BBB’.
В частности, значение — это, __PHP_Incomplete_Class Object
которое является результатом unserialize
. Хотя почему is_object
возвращать false?
Ответ №1:
Примечание:
Эта функция вернет FALSE, если используется для несериализованного объекта, в котором отсутствует определение класса (даже если gettype() возвращает object).
Комментарии:
1. Ну, это просто глупо… и что теперь я должен делать
gettype($value)==='object'
, даже если те же документы конкретно рекомендуют против этого?2. Если я правильно понимаю документацию, убедитесь, что определение класса для вашего объекта присутствует перед отменой сериализации.
Ответ №2:
Как объяснял Эй Джей, объект не является объектом, потому что он неполный. Объект был помещен в _SESSION, а затем при последующей попытке не удалось десериализовать и запустить, потому что класс objects еще не определен. Если вы можете решить эту проблему, либо включив класс в область видимости перед началом сеанса, либо используя __autoload или spl_autoload_register в качестве последней попытки спасения.
Комментарии:
1. Это сериализация объекта JavaScript. Устаревший код, я действительно не могу изменить структуру сериализации. Кроме того, на самом деле ему вообще не обязательно быть объектом … он должен десериализоваться в ассоциативный массив.
json_encode/decode
не существовал, когда был написан этот код :2. JavaScript? JSON? Возможно, обновите свой первоначальный вопрос соответствующей информацией, тогда в его нынешнем виде это, похоже, чисто PHP-вопрос.
3. @AJ Я в таком же замешательстве, как и ты сейчас.
4. @AJ/David: Что вас так смущает? Это чисто PHP-вопрос. Я просто говорю, что сериализованный объект создается с помощью JavaScript. В частности, он создает строку, которую
unserialize
могут понять PHP. Когда форма опубликована, она передается на PHP. Я не могу изменить часть JS, так что это не имеет значения.5. @David: Да… это именно то, что я делаю.