Другая необходимость, возникающая при работе с сеансами — определить, были ли зарегистрированы сеансовые переменные. Это можно сделать с помощью оператора isset, позволяющего проверить существование соответствующего ключа в массиве $_SESSION, или функции session_is_registered(): session_is_registered($name) где $name — строка, представляющая имя сеансовой переменной, которую нужно проверить. Эта функция возвращает true, если переменная была зарегистрирована, и false — если нет. Для того чтобы реально продемонстрировать работу сеансов в РНР, сначала нужно создать ситуацию, в которой пользовательские данные должны быть сохранены во время запроса к серверу. Идеальным примером, удовлетворяющим таким требованиям, является пример с тележкой для покупок. Предположим, что вся функциональность тележки заключена в одном PHP-классе ShoppingCart. В этой ситуации для каждого покупателя создается единственный экземпляр тележки, который регистрируется как сеансовая переменная, сохраняемая в массиве $_SESSION. Для каждого последующего запроса экземпляр (и все его данные) пересоздаются РНР. Реализация такой системы показана в листинге 6.8.
Листинг 6.8. Пример с тележкой для покупок на РНР Файл ShoppingCart.class.php <?php class ShoppingCart { private $cart; function construct() { $this->cart = array(); } public function addltem($id, $name, $cost) { foreach($this->cart as $key=>$items) ( if($items['id'] == $id) { $this->cart[$key]['quantity']++; return; $this->cart[] = array('id' => $id, 'name' => $name, 'cost' => $cost, 'quantity' => 1) ; ( public function delltem($id) { foreach($this->cart as $key => $items) { 150 Использование РНР для разработки Web-приложений _ _ _ _ _ . _ if($items['id'] == $id) { if($items['quantity'] > 1) { $this->cart[$key]['quantity']—; } else { unset($this->cart[$key]); } return true; return false; ) public function getCartO { return $this->cart; } public function clearCartf) { $this->cart = array(); Файл Listing6_8.php <?php require_once("ShoppingCart.class.php"); session_start (); if(!isset($_SESSION['cart']) II !is_object($_SESSION['cart' ])) { $_SESSION['cart'] = new ShoppingCart (); /* Добавить книгу в тележку (элемент #43 стоимостью $4 9.95) */ $_SESSION['cart']->addItem(43, "Book: PHP Unleashed", 49.95);
Несмотря на то что РНР не имеет проблем с использованием экземпляров объектов в качестве сеансовых переменных в отличие от любых других типов данных в РНР, для объектов, пересоздаваемых внутри сеанса, в РНР должен быть определен начальный класс. Это означает, что определение класса ShoppingCart должно быть включено в сценарий для переменной $_SESSION [' c a r t ' ], чтобы она могла быть корректно пересозданной.