Здравствуйте! В общем, одна из задач в книге меня поставила в ступор, потому что даже не знаю с чего начать. Сама задача: 1. Создайте класс Ingredient. Каждый экземпляр этого класса должен представлять отдельный ингредиент блюда, а также отслеживать наименование ингредиента и его стоимость. 2. Введите в свой новый класс Ingredient метод, изменяющий стоимость ингредиента блюда. 3. Создайте подкласс, производный от представленного в этой главе класса Entree. Этот под- класс должен принимать объекты типа Ingredient вместо символьной строки с наимено- ваниями ингредиентов для их обозначения. Введите в этот подкласс метод, возвращающий общую стоимость блюда. Первые два пункта я сделал, а вот третий вообще не понимаю. Подкласс, который просят создать, должен принимать объекты моего класса Ingredient? А как он это должен делать? В общем, в замешательстве я. А хочется разобраться, все-таки. Вот тот самый класс Entree, о котором идет речь: PHP: class Entree { public $name; public $ingredients = array(); public function __construct($name, $ingredients) { if (! is_array($ingredients)) { throw new Exception(' $ingredients must be an array' ); } $this->name = $name; $this->ingredients = $ingredients; } public function hasIngredient($ingredient) { return in_array($ingredient, $this->ingredients); } }
Возможно как-то так: PHP: class Ingridient { public $name; public $cost; public function __construct($name, $cost) { $this->name = $name; $this->cost = $cost; } public function changeCost($newCost) { $this->cost = $newCost; } } class Entree { public $ingridients = []; public function __construct(array $ingridients) { $this->ingridients = $ingridients; } public function getFullCost() { $sum = 0; foreach ($this->ingridients as $ingridient) { $sum += $ingridient->cost; } return $sum; } } $ingridient1 = new Ingridient('potatoes', 5); $ingridient2 = new Ingridient('carrots', 10); $ingridient3 = new Ingridient('onions', 15); $soup = new Entree([ $ingridient1, $ingridient2, $ingridient3 ]); echo $soup->getFullCost(); // 30
Ну вот я еще больше запутался теперь. Глянул на решение с утра, не задумываясь, и даже и не заметил, что подкласса-то там нет. Ну это сущности, которые создаются на его основе? Но вот я не пойму, что значит "Этот под- класс должен принимать объекты типа Ingredient"? Это речь про мой класс, который я должен был создать в первом пункте или нет? И какими свойствами этот подкласс обладать-то должен тогда? А если там должен быть метод по определению общей стоимости блюда, значит, в свойствах должна быть цена ингредиента как минимум и значит, что речь не про мой собственный класс Ingredient, в котором тоже есть цена. В общем, решительно не понимаю, что именно надо сделать.
Ну если сущности создаются, их можно засунуть в массив? Засунуть в параметр? Получить открытые свойства экземпляра, вызывать открытые методы, если они есть? Перечитайте тогда главу соответствующую, только не читайте одни примеры, как тут многие делают. Заодно можете прочитать https://www.php.net/manual/ru/language.oop5.php