Другие причины для __PHP_Incomplete_Class

0

Вопрос: Как я могу избежать получения неполного класса PHP в этом случае?

Справочная информация. Код - это скрипт, получающий POST-переменные из формы, выполняющий некоторые операции над \$_SESSION['objectCart'] и, наконец, перенаправление посетителя на другую страницу. $_SESSION['objectCart'] содержит экземпляр класса 'cart', определенного в файле

__DIR__ . $lib . 'user.class.php'    

Когда я запускаю скрипт, он останавливается, и дальнейшее исследование показывает __PHP__Inполный класс.

Мой код:

require_once __DIR__ . $lib . 'utility.class.php';
require_once __DIR__ . $lib . 'productcatalog.class.php';
require_once __DIR__ . $lib . 'user.class.php';
require_once __DIR__ . $lib . 'cart.class.php';

session_start();

print_r( $_SESSION['objectCart'] );

Выход HTML:

__PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => cart [itemsExtended:protected] => Array ( [0] => Array ( [item_name] => ...

РЕШЕНИЕ - ЧАСТИЧНО:

Сессия уже началась, так как обычно с этой проблемой. Он был идентифицирован путем размещения

echo session_id(); 

до того, как начался телеканал.

  • 0
    Привет @MagnusN см. Здесь: - stackoverflow.com/questions/2010427/…
  • 0
    Я не уверен, что вам действительно нужно то, что вы пытаетесь сделать, но вместо сохранения необработанного экземпляра в сеанс сохраните его сериализованным
Показать ещё 4 комментария
Теги:
class
session

1 ответ

0
Лучший ответ

В комментариях упоминается довольно хорошее дублирование, и, как я уже сказал, вы можете использовать serialize() здесь, однако я редко нахожу причины для сохранения объектов в сеансе для дальнейшего использования.

Я бы предпочел сохранить в сеансе то, что мне нужно, чтобы создать объекты, а затем из одной точки входа, чтобы зарегистрировать необходимые объекты. Of, используйте базу данных для сохранения необходимых полей и сохраните только идентификатор в сеансе.

Скажем, вам нужна информация для текущего зарегистрированного пользователя через все ваши приложения после успешного входа в систему. Вместо того, чтобы назначать экземпляр класса User в сеанс, я бы сохранил его данные в сеансе и конструировал объект каждый раз, когда запрашивается новая страница.

Это может добавить дополнительные накладные расходы, если вы храните идентификатор и запрашиваете БД для получения всей информации для пользователя при каждом обновлении, но все же я бы пошел на это, если я действительно не вижу значительного замедления работы приложения.

main_entry_point.php:

if (isset($_SESSION['user_id'])) {
    $row = $db->query("SELECT name, email, age, role_id FROM users WHERE id = " . $_SESSION['user_id']);
    $user = new User($row['name'], $row['email'], $row['age'], $row['role_id']);
}

Здесь может быть много дополнительного сахара, например, инъецирование экземпляра пользователя в ваш класс приложения, если он у вас есть, и т.д. И т.д., Поэтому вы не будете работать с глобальными переменными ($user в этом случае является псевдоглобальной переменной для меня, так как у вас есть основная точка входа, которая включена в каждое обновление, например index.php в инфраструктурах MVC), но это не имеет значения здесь, точка была в длинном рассказе - зарегистрировать ваш объект корзины из определенных вещей, хранящихся в сессия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню