Как и у большинства осваивающих ООП у меня возникают трудности когда нужно
применить всю ту теорию которую я черпаю из книг и интернета, в теории всё довольно просто но когда дело доходит до практического применения на живых проектах то возникает какой-то непонятный ступор. Чтобы этот ступор постепенно устранить решил потренироваться именно в "объектном анализе" на примере процесса приготовления борща, и вот что у меня вышло.
Я представил процесс приготовления из нескольких шагов: покупка продуктов, подготовка продуктов, варка борща в кастрюле, создал классы, методы.
Ну и собственно сам код (местами страшен, знаю, но кто начинал сразу идеально?):
<?php
// ---------------- Класс Повар: покупает продукты, нарезает продукты, собирает ингредиенты ------
class Cook {
public $money = 100;
public $rawFood;
public $ingredients = array();
public function buyFood(Shop $shop) // Покупка продуктов.
{
$rawFood = $shop->sellFood($this->money);
if($rawFood){
$this->rawFood = $rawFood;
return $this;
}
return $this;
}
public function prepareFood() // Подготовка продуктов.
{
foreach($this->rawFood->stock as $food)
{
$ingredient = $this->cut($food);
$this->ingredients[] = $ingredient;
}
return $this;
}
public function cut($food) // Нарезка продуктов.
{
$cutted = $food; // Здесь некий процесс "нарезки", не придумал как отобразить.
return $cutted;
}
public function combineFood(Pot $pot) // Складываем нарезанное в кастрюлю.
{
$pot->containingIngredients($this->ingredients);
return $this;
}
}
// ---------------- Класс Магазин: содержит продукты, продает продукты --------------------------
class Shop {
public $foodStorage;
public $productsTotalPrice = null;
public function __construct(){
$this->foodStorage = new FoodStock(); // Заполняем магазинные полки продуктами.
}
public function sellFood($money) // Продажа продуктов
{
$totalPrice = null;
for($i = 0; $i < count($this->foodStorage->stock); $i++) {
$totalPrice += $this->foodStorage->stock[$i]->price;
}
$this->productsTotalPrice = $totalPrice;
if($this->productsTotalPrice < $money){ // Проверка хватит ли денег на всё.
return $this->foodStorage;
}
else {
return false;
}
}
}
// ---------------- Класс Плита: нагревает кастрюлю ---------------------------------------------
class Stove {
public $temperature;
public function turnOn() // Включаем плиту.
{
$this->temperature = 100;
return $this->temperature;
}
}
// ---------------- Класс Кастрюля: содержит воду и ингредиенты, варит борщ ---------------------
class Pot {
public $water = null;
public $containedIngredients = null;
public $temperature = null;
public $timer = null;
public function addWater() // Добавляем воду.
{
$this->water = '2000 ml';
return $this;
}
public function boil(Stove $stove) // Варка.
{
$temperature = $stove->turnOn();
$this->temperature = $temperature;
$this->timer = 60;
if($temperature = 100 && $this->timer >= 60)
{
echo "Приготовлено!";
}
}
public function containingIngredients($ingredients) // Заполнение кастрюли ингредиентами.
{
$this->containedIngredients = $ingredients;
return;
}
}
// ---------------- Класс Склад: содержит разные продукты --------------------------------
class FoodStock {
public $stock = [];
public function __construct(){
$potato = new RawFood('25', 'potato');
$carrot = new RawFood('15', 'carrot');
$onion = new RawFood('20', 'onion');
$meat = new RawFood('35', 'meat');
// Вот тут хрень конечно но что-то не додумался как заполнить массив циклом.
$this->stock[] = $potato;
$this->stock[] = $carrot;
$this->stock[] = $onion;
$this->stock[] = $meat;
}
}
// ---------------- Класс Продукт: содержит цену и имя продукта ---------------------------
class RawFood {
public $price;
public $name;
public function __construct($price, $name){
$this->price = $price;
$this->name = $name;
}
}
// ---------------- ПРОЦЕСС ПРИГОТОВЛЕНИЯ ------------------------------------------------
$cook = new Cook();
$shop = new Shop(); // Заполняется автоматически.
$pot = new Pot();
$stove = new Stove();
$cook
->buyFood($shop)
->prepareFood()
->combineFood($pot);
$pot
->addWater()
->boil($stove);
И вроде даже работает (по крайней мере Notice, Warning и FatalError не выдает):