Класс Cart онлайн урок.


Создадим класс корзины, который будет взаимодействовать с классом кук. Этот класс, прежде всего, будет содержать закрытое свойство, в котором будет содержаться массив из продуктов, а именно - их идентификаторы.

class Cart
{
   private $products;
}


Также нам потребуются методы добавления продукта в корзину, удаления, получения списка продуктов и конструктор.

Конструктор будет обращаться к куки с названием books и получать его содержимое. В самой куке books идентификаторы товаров будут сохранятся строке, которая является сериализованным массивом идентификаторов. В свойство products будет попадать массив из соответствующих значений:

function __construct()
{
$this->products = Cookie::get('books') == null ?
array()
:
unserialize(Cookie::get('books'));
}


Добавим в класс метод getProducts(), который будет геттером для свойства products.

public function getProducts()
{
  return $this->products;
}


Для добавления товара в корзину, необходимо его идентификатор вставить в массив products, а далее переписать куку books. При этом мы проверяем, нету ли этого товара на данный момент в корзине.

public function addProduct($id)
{
$id = (int)$id;

if (!in_array($id, $this->products)) {
array_push($this->products, $id);
}

Cookie::set('books', serialize($this->products));
}


Добавим методы для удаления конкретного товара и очистки корзины:

public function deleteProduct($id)
{
$id = (int)$id;

$key = array_search($id, $this->products);
if ($key !== false){
unset($this->products[$key]);
}

Cookie::set('books', serialize($this->products));
}

public function clear()
{
Cookie::delete('books');
}


Как видим очистка корзины - это просто удаление куки, а алгоритм удаления товара очень похож на добавление. Тут была использована функция array_search(), которая находит ключ массива для удаления.

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

public function isEmpty()
{
return !$this->products;
}