Вес не включил в базовый, потому что он только в одном месте фигурирует. В принципе, можно и включить. Название сделал приватным, поскольку по-хорошему все поля должны быть или приватными, или защищёнными, но не публичными. Одну нельзя - на уровне базового класса мы знаем только, что может быть скидка, а как она вычисляется - определяется производными классами. У тебя куча функций непонятного назначения, и самое главное - клиентский код точно знает, с каким классом он работает - это неинтересно. Так можно было и вообще не городить всё это наследование. На самом деле, тот код, который я показал, тоже далеко не идеальное решение задачи, но тебе пока показывать самое правильное решение рано, ты бы совсем ничего не понял. Прочитай книжку Зандстры.
@Dimon2x, твой код стал лучше, чем был, но есть моменты которые надо улучщить. PHP: header('Content-Type: text/html; charset:utf-8'); error_reporting(-1); abstract class Product { private $title; private $price; private $weight; private $discount = 10; public function getDiscount() { return $this->discount; } public function getPrice() { return $this->price - (($this->price * $this->getDiscount()) / 100); } function getPriceWithoutDiscount() { return $this->price; } function setTitle($title) { $this->title = $title; } function setPrice($price) { $this->price = $price; } function setWeight($weight) { $this->weight = $weight; } function getWeight() { return $this->weight; } public function __construct($title, $price, $weight) { $this->setTitle($title); $this->setWeight($weight); $this->setPrice($price); } } class Planshet extends Product { } class Potato extends Product { function getPrice() { if ($this->getWeight() > 10000) { return parent::getPrice(); } else { return $this->getPriceWithoutDiscount(); } } } class Jacket extends Product { } $planshet = new Planshet('Планшет', 2000, 400); $potato = new Potato('Картошка', 700, 12000); $jacket = new Jacket('Куртка', 700, 2000); var_dump($potato->getPrice()); По условию задачи, у всех продуктов скидка 10%, поэтому в родительском классе определяем этот геттер getPrice с ценой где скидка уже учтена.(такое у тебя условие) Для продуктов где скидка может быть другая при определенных условиях переопределяешь getPrice как я уже сделал. а если этот порог не превзойден, вызывается метод определенный в родительском классе, для получения цены без скидки. Выще в коде, почти всегда я работаю со свойсвами через геттеры и сеттеры. Это поможет тебе в будущем, вдруг ты решить фильтровать какие либо значения, или же решишь проделать над ними кое-какие операции. Да и для доступа из дочерних классов они нужны. И свойства лучше всегда херачить в столбик, это удобно+ ты можешь документировать каждое свойство как полагается.
А тут же такие методы не нужны PHP: function setTitle($title) { $this->title = $title; } function setPrice($price) { $this->price = $price; } function setWeight($weight) { $this->weight = $weight; } В конструкторе же можно так прописать PHP: $this->title = $title; $this->price = $price; $this->weight = $weight;
Можно. Но представь, что ты захочешь проделать какие либо операции с входными данными? Будешь это все городить в контсрукторе? Всегда работай с свойсвами через сеттеры и геттеры.
Я ещё сделал доставку на все продукты - 250 рублей, но если на продукт была скидка - 300 рублей PHP: <?php header('Content-Type: text/html; charset:utf-8'); error_reporting(-1); abstract class Product{ private $title; private $price; private $weight; private $discount = 10; static $delivery = 250; public function incDelivery(){ return self::$delivery+50; } public function getDiscount(){ return $this->discount; } public function getPrice(){ return round($this->price - ($this->price * $this->getDiscount()/100)); } function getPriceWithoutDiscount() { return $this->price; } public function getTitle(){ return $this->title; } public function getWeight(){ return $this->weight; } public function dostavka(){ if($this->getPriceWithoutDiscount() > $this->getPrice()){ return $this->incDelivery(); } else{ return self::$delivery; } } public function __construct($title, $price, $weight){ $this->title = $title; $this->price = $price; $this->weight = $weight; } } class Planshet extends Product{} class Veggies extends Product{ function getPrice(){ if($this->getWeight() > 10000){ return parent::getPrice(); } else{ return $this->getPriceWithoutDiscount(); } } } class Clothing extends Product{} $planshet = new Planshet('Asus', 2000, 400); $veggies = new Veggies('Морковка', 700, 12000); $veggies2 = new Veggies('Лук', 700, 3000); $clothing = new Clothing('Куртка', 700, 2000); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php echo $planshet->getTitle() . ' цена без скидки ' . $planshet->getPriceWithoutDiscount() . ', со скидкой ' . $planshet->getPrice() . ', доставка ' . $planshet->dostavka(); echo '<br>'; echo $veggies->getTitle() . ' цена без скидки ' . $veggies->getPriceWithoutDiscount() . ', со скидкой ' . $veggies->getPrice() . ', доставка ' . $veggies->dostavka(); echo '<br>'; echo $veggies2->getTitle() . ' цена без скидки ' . $veggies2->getPriceWithoutDiscount() . ', со скидкой ' . $veggies2->getPrice() . ', доставка ' . $veggies2->dostavka(); echo '<br>'; echo $clothing->getTitle(). ' цена ' . $clothing->getPrice() . ', доставка ' . $clothing::$delivery; ?> </body> </html>
Не вижу где ты определяешь составила ли скидка 300р PHP: <?php header('Content-Type: text/html; charset:utf-8'); error_reporting(-1); abstract class Product { private $title; private $price; private $weight; private $discount = 10; public function getDiscount() { return $this->discount; } public function getPrice() { return round($this->price - ($this->price * $this->getDiscount() / 100)); } function getPriceWithoutDiscount() { return $this->price; } public function getTitle() { return $this->title; } public function getWeight() { return $this->weight; } public function costDelivery() { $discount = $this->getPriceWithoutDiscount() - $this->getPrice(); switch ($discount) { case ($discount > 400): return 200; case ($discount > 300): return 250; default : return 300; } } public function __construct($title, $price, $weight) { $this->title = $title; $this->price = $price; $this->weight = $weight; } } class Planshet extends Product { } class Veggies extends Product { function getPrice() { if ($this->getWeight() > 10000) { return parent::getPrice(); } else { return $this->getPriceWithoutDiscount(); } } } class Clothing extends Product { } $planshet = new Planshet('Asus', 2000, 400); $veggies = new Veggies('Морковка', 10000, 12000); $veggies2 = new Veggies('Лук', 700, 3000); $clothing = new Clothing('Куртка', 700, 2000); var_dump($veggies->costDelivery()); Теперь самое время подумать о рефактоинге. Советую перечитать/прочитать о полиморфизм и композиции.
Теперь я правильно сделал абстрактный класс? Подскажите, что можно добавить? PHP: <?php header('Content-Type: text/html; charset=utf8'); abstract class Animal{ public $name; public function __construct($name){ $this->name = $name; } public function eat(){ echo 'ням-ням'; } abstract public function voice(); } class Cat extends Animal{ public function voice(){ return 'Мяу-мяу'; } } class Dog extends Animal{ public function voice(){ return 'Гав-гав'; } } $cat = new Cat('Мурка'); $dog = new Dog('Мухтар'); echo $cat->name . ' говорит ' . $cat->voice(); echo '<br>'; echo $dog->name . ' говорит ' . $dog->voice();
Ну класс сделал, но так его использовать Ну скучно же. Этот код будет работать и без абстрактных классов. Ну хотя бы в массив их объедини и перебором. Или сделай функцию, которая принимает Animal, а передай её $dog и $cat, просто, чтоб почувствовать, зачем это всё нужно - все эти абстрактные классы и прочие приблуды
@mkramer так? PHP: <?php header('Content-Type: text/html; charset=utf8'); abstract class Animal{ public $name; public function __construct($name){ $this->name = $name; } public function eat(){ echo 'ням-ням'; } abstract public function voice(); } class Cat extends Animal{ public function voice(){ return 'Мяу-мяу'; } } class Dog extends Animal{ public function voice(){ return 'Гав-гав'; } } $cat = new Cat('Мурка'); $dog = new Dog('Мухтар'); function createAnimal($animal, $name){ return new $animal($name); } $cat = createAnimal('Cat', 'Мурка'); echo $cat->name . ' говорит ' . $cat->voice();
та ни PHP: $animals = []; $animals[] = new Cat('Мурка'); $animals[] = new Dog('Мухтар'); function doSomeWork(Animal $creature) { echo $creature->name . ' does ' . $creature->eat(); echo $creature->name . ' says ' . $creature->voice(); } foreach ($animals as $animal) { doSomeWork($animal); }