Есть такое задание: Опишите класс Корзина, в которые можно передавать любой товар. Опишите у корзины нужные свойства и методы. Например метод получения суммы заказа, удаление товара из корзины и т.д. Я вообще тут запутался, правильно ли я сделал добавление товара? PHP: <?php header('Content-Type: text/html; charset=utf-8'); error_reporting(-1); interface getProduct{ public function getName(); public function getPrice(); } interface Basket{ public function getProduct(); public function delProduct(); } abstract class Product implements getProduct{ private $name; private $price; public function __construct($name, $price){ $this->name = $name; $this->price = $price; } public function getName(){ return $this->name; } public function getPrice(){ return $this->price; } } class Tablet extends Product{} class Cart extends Tablet implements Basket{ public function getProduct(){ return $this->getName(); } public function delProduct(){ return $this->getName(); } } $tablet = new Tablet('Asus', 3000); $basket = new Cart($tablet->getName(), $tablet->getPrice()); echo $basket->getProduct();
Плохо. Зачем все эти интерфейсы и абстрактный класс ? Не хватает парочки трейтов и генератор в тележке. Упростите. У вас в задаче описано две сущности. Сделайте два класса и пляшите от них.
@Dimon2x, как уже сказали выше, слишком все усложнил. Вот одна из возможных реализаций: PHP: namespace cart; class Cart extends \ArrayObject { private $totalPrice = 0; /** * * @param product\Product $value */ function append($value) { $this->totalPrice += $value->getPrice(); parent::append($value); } /** * * @param int $index */ function offsetUnset($index) { $this->totalPrice-= $this->offsetGet($index)->getPrice(); parent::offsetUnset($index); } } использование: PHP: $cart = new cart\Cart(); $cart->append(new product\Product('d',2000));//добавим продукт $cart->append(new product\Product('Планшет', 4000));//еще один var_dump($cart); $cart->offsetUnset(1);//удаление var_dump($cart); --- Добавлено --- Эта не конечная реализация, а пример.
Я сделал добавление товара в корзину и удаление, но если удалять товар, то удаляться будет всегда первый, как сделать, что бы удалить тот, который нужно? PHP: <?php abstract class Product{ public $title; public $price; public function __construct($title, $price){ $this->title = $title; $this->price = $price; } } class Cart{ public $countPdoduct = []; public function getProduct($product){ $addProduct = ''; $addProduct = array_push($this->countPdoduct, $product); if($addProduct){ echo 'Товар добавлен в корзину'; } } public function deleteProduct($product){ if(in_array($product, $this->countPdoduct)){ unset($this->countPdoduct[0]); echo 'Товар удалён из корзины'; } } } class Planshet extends Product{} $planshet = new Planshet('Asus', 2000); $korzina = new Cart(); echo '<pre>'; var_dump($korzina->countPdoduct); echo '</pre>'; $korzina->getProduct($planshet); //добавляю товар в корзину echo '<pre>'; var_dump($korzina->countPdoduct); echo '</pre>'; $korzina->deleteProduct($planshet); //удаляю из корзины echo '<pre>'; var_dump($korzina->countPdoduct);
Сделал изменения, совпадения есть, но почему не удаляет? PHP: class Cart{ public $countPdoduct = []; public function getProduct($product){ $addProduct = ''; $addProduct = $this->countPdoduct[$product->title] = $product; if($addProduct){ echo 'Товар добавлен в корзину'; } } public function deleteProduct($product){ echo key($this->countPdoduct); echo '<br>'; echo $product->title; if(in_array(key($this->countPdoduct), $this->countPdoduct)){ unset($this->countPdoduct[key($this->countPdoduct)]); echo 'Товар удалён из корзины'; } } }
Ну а теперь-то почему не удаляет? ключи выводит, я этот ключ подставляю в массив из которого надо удалить и не удаляется PHP: <?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 getProduct($product){ $addProduct = ''; $addProduct = $this->countProduct[$product->title] = $product; if($addProduct){ echo 'Товар добавлен в корзину'; } } public function deleteProduct($product){ foreach($this->countProduct as $key => $value){ echo $key; if(in_array($key, $this->countProduct)){ unset($this->countProduct[$key]); echo 'Товар удалён из корзины'; } } } } class Planshet extends Product{} $planshet = new Planshet('Asus', 2000); $planshet2 = new Planshet('Lenovo', 3000); $korzina = new Cart(); echo '<pre>'; var_dump($korzina->countProduct); echo '</pre>'; $korzina->getProduct($planshet); //добавляю товар в корзину $korzina->getProduct($planshet2); //добавляю товар в корзину echo '<pre>'; var_dump($korzina->countProduct); echo '</pre>'; $korzina->deleteProduct($planshet); //удаляю из корзины echo '<pre>'; var_dump($korzina->countProduct); --- Добавлено --- кстати, если убрать условие, то в цикле заработает удаление, только удалит всё --- Добавлено --- Я понял, то, что in_array ищет только значения, без ключей, то есть ключи она игнорирует
У меня получилось PHP: <?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 getProduct($product){ $addProduct = ''; $addProduct = $this->countProduct[$product->title] = $product; if($addProduct){ echo 'Товар добавлен в корзину'; } } public function deleteProduct($product){ echo $product->title; foreach($this->countProduct as $key => $value){ if($product->title == $key){ unset($this->countProduct[$product->title]); echo 'Товар удалён из корзины'; } } } } class Planshet extends Product{} $planshet = new Planshet('Asus', 2000); $planshet2 = new Planshet('Lenovo', 3000); $korzina = new Cart(); echo '<pre>'; var_dump($korzina->countProduct); echo '</pre>'; $korzina->getProduct($planshet); //добавляю товар в корзину $korzina->getProduct($planshet2); //добавляю товар в корзину echo '<pre>'; var_dump($korzina->countProduct); echo '</pre>'; $korzina->deleteProduct($planshet); //удаляю из корзины echo '<pre>'; var_dump($korzina->countProduct);
я сделал свойство для счётчика, если добавить такой же товар то количество увеличивается PHP: <?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){ $getProduct = ''; if(array_key_exists($product->title, $this->countProduct)){ $this->countProduct[$product->numberProduct++] = $product; echo 'Товар добавлен в корзину'; } else{ $this->countProduct[$product->title] = $product; echo 'Товар добавлен в корзину'; } } public function deleteProduct($product){ echo $product->title; foreach($this->countProduct as $key => $value){ if($product->title == $key){ unset($this->countProduct[$product->title]); echo 'Товар удалён из корзины'; } } } } class Planshet extends Product{} $planshet = new Planshet('Asus', 2000); $planshet2 = new Planshet('Lenovo', 3000); $planshet3 = new Planshet('Lenovo', 3000); $korzina = new Cart(); echo '<pre>'; var_dump($korzina->countProduct); echo '</pre>'; $korzina->addProduct($planshet); //добавляю товар в корзину $korzina->addProduct($planshet2); //добавляю товар в корзину $korzina->addProduct($planshet3); //добавляю товар в корзину echo '<pre>'; var_dump($korzina->countProduct); echo '</pre>'; $korzina->deleteProduct($planshet); //удаляю из корзины echo '<pre>'; var_dump($korzina->countProduct);
А попробуйте ещё больше в ООП. Реализуйте методы, которые вам будут интересны в дальнейшем. Можно ещё Cart заэкстендить от ArrayIterator. PHP: Cart->hasProduct(); Cart->getProduct(); Cart->removeProduct(); Cart->removeAll(); Cart->getAll(); Добавьте свойство вашему продукту, такое как целочисленное id. И рулите по нему, а не по строковому значению какого-то тайтла.
я ввёл количество, но оно почему-то не увеличивается 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){ $getProduct = ''; if(array_key_exists($product->title, $this->countProduct)){ $product->numberProduct .= + 1; echo 'Товар добавлен в корзину<br>'; } 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); --- Добавлено --- Так тоже не добавляется PHP: return $product->numberProduct = $product->numberProduct+1;
Вот такая проблема, количество товаров нормально считает, а вот цену не правильно, если добавить 4 одинаковых товара, стоимостью 2000, то должно получится 8000, а получается 16 000, почему? И почему не узнаётся цена добавленного товара? Я же говорю ей, возьми общую цену у товаров, которые лежат в корзине и добавь к ним цену нового товара, а получается, что складывается общая цена и общая цена. PHP: <?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)){ //если такой товар уже есть в корзине //то его количество учеличить на 1 $this->countProduct[$product->title]->numberProduct++; $this->countProduct[$product->title]->price += $product->price; var_dump($product->price); echo 'Товар добавлен в корзину<br>'; echo 'Количество ' . $product->numberProduct . '<br>'; echo 'Цена ' . $this->countProduct[$product->title]->price . '<br>'; echo '<br>'; } else{ //если нету, то добавить $this->countProduct[$product->title] = $product; echo 'Товар добавлен в корзину<br>'; echo '<br>'; } } } class Planshet extends Product{} $asus = new Planshet('Asus', 2000); $korzina = new Cart(); $korzina->addProduct($asus); //добавляю товар в корзину $korzina->addProduct($asus); //добавляю товар в корзину $korzina->addProduct($asus); //добавляю товар в корзину $korzina->addProduct($asus); //добавляю товар в корзину
Я сделал. Создал такие методы: 1) Добавление продукта. 2) Добавление одинакового продукта 3) Удаление одного продукта 4) Удаление всех продуктов 5) Получение названия и количество продуктов 6) Получение общей цены всех продуктов PHP: <?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();