Объект класса «__PHP_Incomplete_Class» с дополнительным свойством __PHP_Incomplete_Class_Name => ‘имя класса’ появляется, когда PHP не удается найти объявление класса при операции десериализации объекта. К примеру, такое может происходить при хранении объекта в сессии, когда сессия открывается до подключения файлов описаний классов.
Выглядит структура такого объекта например так:
1 2 3 4 5 6 7 8 9 10 11 12 |
[men] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => kingdom_people [N:kingdom_people:private] => Array ( [free] => 100 ) [total] => 0 [moral] => 50 [moralMax] => 100 ) |
1 2 3 4 |
require_once(dirname(__FILE__) . '/myClass.class.php'); require_once(dirname(__FILE__) . '/myClass_2.class.php'); session_start(); ... |
1 |
$myClassObject = (myClass) $incompleteObject; |
К сожалению, в PHP такой фокус не пройдет. :)
Вместо этого напишем простую функцию по инициализации объекта myClass из экземпляра класса __PHP_Incomplete_Class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class myClass { //описание каких то свойств вашего класса private ...; public ...; //и описание его методов function myClass() { //конструктор ; } //методы ... //вот статическая функция, которая восстанавливает объект по данным __PHP_Incomplete_Class. //на входе $obj - наш дефектный объект, жертва ранней десериализации //на выходе объект класса myClass, который нам и нужно было получить static function reCreate($obj) { $obj = (array) $obj; $newObj = new myClass(); foreach($obj as $k => $v) { //после преобразования в массив мы можем выделить название свойства даже в случае private //название выглядит как chr(0) . 'myClass' . chr(0) . 'propertyName'; $parts = explode(chr(0), $k); if ($k != '__PHP_Incomplete_Class_Name') { if ($parts[0] == $k) $newObj->reCreatePrivate($k, $v); else $newObj->reCreatePrivate($parts[2], $v); } } return $newObj; } //эта публичная функция позволит перезаписать любые private и public свойства function reCreatePrivate($name, $value) { $this->$name = $value; } } |
Тогда перед использованием объекта необходимо будет запустить его инициализацию:
1 |
$myClassObject = myClass::reCreate($incompleteObject); |
При копировании кода все в строку потом вставляется!..
Важно откуда и куда копируете. К примеру, копируя из firefox в notepad++ получаем все в лучшем виде.
Спасибо большое! Пол дня не мог решить проблему. Ваш сайт помог! Здравия вам и успехов!