Добавление товара в корзину и удаление
Если добавлять одинаковые товары, то по логике свойство 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); |
Зачем класс 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; } } |
Цитата:
|
Цитата:
В цитате Вы привели код из реализации ТС, а в самом вопросе код из реализации предложенной мною... |
Автор сия и вы также подсчитываете количество товаров $product->numberProduct+ 1; А зачем, если это просто длина массива?
Да и вообще, корзина в первую очередь, это хранение, а уж затем способ. Автору сначала бы не мешало нечто проще написать, но именно хранение, а уж затем ООП. |
Цитата:
|
DivMan,
у вас нет корзины как таковой, есть некая обертка не понятно чего. Обратите внимание на то, что у вас проверка наличия товара производится не по уникальному идентификатору, и даже не по наименованию товара, что тоже плохо, а вообще по бренду. Кроме того - есть массив А. В него надо поместить ключ C. Вопрос - надо ли при этом проверять наличие его в массиве (речь не о поиске, а именно о добавлении)? |
Цитата:
С 36-й строки того же комментария начинается класс, реализацию которого предложил я и в нем нет указанного вами кода) |
Цитата:
|
Создал такие методы:
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(); |
Часовой пояс GMT +3, время: 19:51. |