Вопрос: Как я могу избежать получения неполного класса 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();
до того, как начался телеканал.
В комментариях упоминается довольно хорошее дублирование, и, как я уже сказал, вы можете использовать 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), но это не имеет значения здесь, точка была в длинном рассказе - зарегистрировать ваш объект корзины из определенных вещей, хранящихся в сессия.