20.04.2017, 13:42
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Добавление товара в корзину и удаление
Если добавлять одинаковые товары, то по логике свойство numberProduct должно увеличиваться на 1.
Оно увеличивается только 1 раз , но почему-то не сохраняется?
Помогите пожалуйста, я уже 3 часа мучаюсь.
23 строка
<?php
abstract class Product{
public $title;
public $price;
public $numberProduct;
public function __construct($title, $price, $numberProduct = 1){
$this->title = $title;
$this->price = $price;
$this->numberProduct = $numberProduct;
}
}
class Cart{
public $countProduct = [];
public function addProduct($product){
if(array_key_exists($product->title, $this->countProduct)){
$res = $product->numberProduct = $product->numberProduct+ 1;
echo 'Товар добавлен в корзину<br>';
return $res;
}
else{
$this->countProduct[$product->title] = $product;
echo 'Товар добавлен в корзину<br>';
}
}
public function deleteProduct($product){
echo $product->title . ' удалён';
unset($this->countProduct[$product->title]);
}
}
class Planshet extends Product{}
$planshet = new Planshet('Asus', 2000);
$planshet2 = new Planshet('Lenovo', 3000);
$planshet3 = new Planshet('Lenovo', 3000);
$planshet4 = new Planshet('Lenovo', 3000);
$planshet5 = new Planshet('Lenovo', 3000);
$korzina = new Cart();
$korzina->addProduct($planshet); //добавляю товар в корзину
$korzina->addProduct($planshet2); //добавляю товар в корзину
$korzina->addProduct($planshet3); //добавляю товар в корзину
$korzina->addProduct($planshet4); //добавляю товар в корзину
$korzina->addProduct($planshet5); //добавляю товар в корзину
echo '<pre>';
var_dump($korzina->countProduct);
echo '</pre>';
$korzina->deleteProduct($planshet); //удаляю из корзины
echo '<pre>';
var_dump($korzina->countProduct);
|
|
22.04.2017, 14:48
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Зачем класс Product объявлен абстрактным?
<?
class Cart{
/*
* Ассоциативный массив.
* Ключ - название продукта, значение - экземпляр класса Product
*/
public $countProduct = [];
public function addProduct($product){
//Почему бы не isset?
if(array_key_exists($product->title, $this->countProduct)){
/*
* Тут происходит увеличение кол-во продукта не в countProduct,
* а в переданном методу экземпляре класса
*/
$res = $product->numberProduct = $product->numberProduct+ 1;
/*
* Чтобы происходило "запоминание" кол-во товара в корзине следует сделать так
* $count=&$this->countProduct[$product->title]->numberProduct;//Получаю кол-во продукта
* //Увеличиваю кол-во сохраненного продукта на 1
* и зачем-то присваиваю это значение свойству numberProduct переданного экземпляра
* $product->numberProduct=++$count;
*/
echo 'Товар добавлен в корзину<br>';
return $res;
}
else{
$this->countProduct[$product->title] = $product;
echo 'Товар добавлен в корзину<br>';
}
}
}
//Если бы мне нужно было сохранить этот принцип работы класса, то я бы его написал так
class Cart{
static $products=array();
public function addProduct(Product $product){
$key=$product->title.' ~ '.$product->price;
self::$products[$key]=isset(self::$products[$key])?
(self::$products[$key]+$product->numberProduct):
$product->numberProduct;
return $this;
}
}
Последний раз редактировалось Nexus, 22.04.2017 в 14:53.
|
|
22.04.2017, 14:56
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Nexus
|
$product->numberProduct = $product->numberProduct+ 1;
|
А это вообще нужно, если количество товаров в корзине это count($products)?
|
|
22.04.2017, 15:36
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
А это вообще нужно, если количество товаров в корзине это count($products)?
|
Не понял вопроса, если честно.
В цитате Вы привели код из реализации ТС, а в самом вопросе код из реализации предложенной мною...
|
|
22.04.2017, 15:39
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Автор сия и вы также подсчитываете количество товаров $product->numberProduct+ 1; А зачем, если это просто длина массива?
Да и вообще, корзина в первую очередь, это хранение, а уж затем способ. Автору сначала бы не мешало нечто проще написать, но именно хранение, а уж затем ООП.
|
|
22.04.2017, 15:56
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Сообщение от Nexus
|
Зачем класс Product объявлен абстрактным?
|
Неизвестно же, какой продукт это будет, новый или б/у.
|
|
22.04.2017, 16:02
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
DivMan,
у вас нет корзины как таковой, есть некая обертка не понятно чего. Обратите внимание на то, что у вас проверка наличия товара производится не по уникальному идентификатору, и даже не по наименованию товара, что тоже плохо, а вообще по бренду.
Кроме того - есть массив А. В него надо поместить ключ C. Вопрос - надо ли при этом проверять наличие его в массиве (речь не о поиске, а именно о добавлении)?
|
|
22.04.2017, 16:28
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
Автор сия и вы также подсчитываете количество товаров $product->numberProduct+ 1; А зачем, если это просто длина массива?
|
До 34-й строки второго комментария я разбираю и комментирую код ТС.
С 36-й строки того же комментария начинается класс, реализацию которого предложил я и в нем нет указанного вами кода)
|
|
22.04.2017, 16:30
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от DivMan
|
Неизвестно же, какой продукт это будет, новый или б/у.
|
Как это связанно с абстракцией класса?))
|
|
22.04.2017, 17:07
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Создал такие методы:
1) Добавление продукта.
2) Добавление одинакового продукта
3) Удаление одного продукта
4) Удаление всех продуктов
5) Получение названия и количество продуктов
6) Получение общей цены всех продуктов
<?php
abstract class Product{
public $title;
public $price;
public function __construct($title, $price){
$this->title = $title;
$this->price = $price;
}
}
class Cart{
public $countProduct = [];
public function addProduct($product){
$product->numberProduct = 1; //если это убрать то тоже буде работать, только не будет учитывать первый
if(array_key_exists($product->title, $this->countProduct)){
$this->countProduct[$product->title]->numberProduct++;
echo 'Товар добавлен в корзину<br>';
}
else{
$this->countProduct[$product->title] = $product;
}
}
public function deleteAllProduct($product){ //убрать все одинаковые продукты из корщины
echo $product->title . ' удалён';
unset($this->countProduct[$product->title]);
}
public function deleteOneProduct($product){ //убрать 1 одинаковый продукт
if(array_key_exists($product->title, $this->countProduct)){
if($this->countProduct[$product->title]->numberProduct > 0){
$this->countProduct[$product->title]->numberProduct--;
echo 'Товар ' . $this->countProduct[$product->title]->title. ' удалён из корзины<br>';
}
}
}
public function showAllProduct(){ //показать список продуктов и количество
$resCountProduct = 0;
foreach($this->countProduct as $key => $value){
echo 'Товар ' . $key . ', количество: ' . $value->numberProduct . '<br>';
$resCountProduct = $resCountProduct + $value->numberProduct;
}
echo 'Общее количество товаров: ' . $resCountProduct;
/*
echo '<pre>';
var_dump($this->countProduct);
*/
}
public function sum(){ //подсчитать общую сумму продукта
$res = 0;
//var_dump($this->countProduct);
foreach($this->countProduct as $key => $value){
$res = $res + ($value->price * $value->numberProduct);
}
return $res;
}
}
class Planshet extends Product{}
$asus = new Planshet('Asus', 2000);
$asus2 = new Planshet('Asus', 2000);
$asus3 = new Planshet('Asus', 2000);
$asus4 = new Planshet('Asus', 2000);
$lenovo = new Planshet('Lenovo', 3000);
$lenovo3 = new Planshet('Lenovo', 3000);
$korzina = new Cart();
$korzina->addProduct($asus); //добавляю товар в корзину
$korzina->addProduct($asus2); //добавляю товар в корзину
$korzina->addProduct($asus3); //добавляю товар в корзину
$korzina->addProduct($asus4); //добавляю товар в корзину
$korzina->addProduct($lenovo); //добавляю товар в корзину
$korzina->addProduct($lenovo3); //добавляю товар в корзину
//$korzina->deleteOneProduct($asus);
echo '<br>';
$korzina->showAllProduct();
echo '<br>';
echo '<br>';
echo 'На сумму: ' . $korzina->sum();
|
|
|
|