Проблема PHP с "__php_incomplete_class" - PullRequest
3 голосов
/ 04 июля 2011

Я занимаюсь разработкой веб-сайта с CodeIgniter и создал пользователя и сеанс:

$user->first_name = 'Gerep';
$user->gender = 'M';
$user->age = '26';


$this->session->set_userdata('user', $user);

Но когда я пытаюсь получить доступ к объекту сеанса:

echo $this->session->userdata('user')->first_name;

Возвращаетсямне ошибка: Object of class __PHP_Incomplete_Class could not be converted to string

Я всегда работал так и никогда не было этой проблемы.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 04 июля 2011

Определение класса не было загружено, когда PHP пытался десериализовать объект в сеансе.

Вы можете решить вашу проблему, используя Автозагрузка .

2 голосов
/ 03 июня 2012

Решение работает, но вы должны убедиться, что определения объектов класса прочитаны перед сеансом:

$autoload['libraries'] = array('**our class**','session','form_validation');
0 голосов
/ 05 февраля 2019

Позиция session_start () важна, потому что скрипт загружается сверху вниз.Когда вы вызываете его до того, как сессия spl_autoload загружается до cllass (Object) и не знает, куда поместить данные, значит, он был создан __PHP_Incomplete_Class Object.До:

 session_start();

 spl_autoload_register(function($class){
     require_once 'classes/'.$class.'.php';
 });

Результат: __PHP_Incomplete_Class Object ([__PHP_Incomplete_Class_Name] => Пользователь [id] ...) После:

 spl_autoload_register(function($class){
 require_once 'classes/'.$class.'.php';
 });

 session_start();

Результат: Пользовательский объект ([id] =>...)

0 голосов
/ 03 ноября 2015

Это происходит со мной недавно, и чтение решений дает мне идею. Первая проблема в том, что session_start был раньше, чем autload, это ошибка. Вы должны объявить свой autload или включить это, тогда вы можете сделать session_start.

0 голосов
/ 20 ноября 2014

Посмотрите, есть ли у вас __autoload ($ class) и измените его на использование метода spl_autoload_register ().Пример:

function __autoload($class)
{
    if (file_exists(APPPATH . 'core/' . $class  .EXT)) {
        require_once APPPATH . 'core/' . $class . EXT;
    } else {
        if (file_exists(APPPATH . 'libraries/' . $class . EXT)) {
            require_once APPPATH . 'libraries/' . $class . EXT;
        }
    }
}

будет изменено на:

function CIautoload($class)
{
    if (file_exists(APPPATH . 'core/' . $class  .EXT)) {
        require_once APPPATH . 'core/' . $class . EXT;
    } else {
        if (file_exists(APPPATH . 'libraries/' . $class . EXT)) {
            require_once APPPATH . 'libraries/' . $class . EXT;
        }
    }
}

spl_autoload_register('CIautoload');

Таким образом, вы сможете использовать все возможности PHP 5.3 (и у вас не будет проблем с композиторомавтозагрузки и CI,; D)

Объяснение

Если через некоторое время, используя PHP 5.2, вы начнете использовать PHP> 5.3 и все методы кодирования OO, вы начнете использовать spl_autoload_register,С CI, в проектах с PHP 5.2, поскольку вы не могли использовать spl_autoload_register, люди использовали известный хак для автозагрузки классов, используя function __autoload($class), который они обычно записывали в файле config.php.Проблема в том, что когда вы смешиваете и то и другое, функция spl_autoload_register переопределяет ваш класс __autoload, и возникает ошибка, о которой спрашивается вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...