Как этот объект может быть объектом, но не object?

#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:

Из руководства по PHP:

Примечание:

Эта функция вернет 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: Да… это именно то, что я делаю.