showStruct(): DTO будет ли это являться нарушением инкапсуляции?нет.
сейчас обучаюсь на курсах по Web-програмированию и сейчас вообще не понимаю как работать с ООПк ООП ты придешь сам, но спустя некоторое время практики (год-два). Когда тебе не потребуются курсы, что бы писать на языке. Сейчас что-либо тебе объяснять бесполезно. И не нужно. Научись писать сначала код без самописных классов.
И как можно сделать страничку с сохранеными данными через ооп?Это тема если и не целой книги, то большого раздела в книге.
PostsView, который отвечает за вывод поста в виде HTMLникакого PostsView быть не должно - достаточного одного View - это, по сути, шаблонизатор, с буферизацией вывода. Что, по твоему, должен делать PostsView?
Что почитать по этой теме"Архитектуру корпоративных приложений" Фаулера. Главу "источники данных".
Ведь мы не можем просто взять и в PostsModel выполнить JOIN необходимых полей из таблицы Users?Я в своем самописном фреймворке так и сделал. Есть метод для JOIN в моей ORM, он возвращает многомерный массив объектов, где каждый конечный элемент (на твоем примере) будет объект модели Поста и Пользователя. Почему так? Потому, что сделать так:
<html>
Текст поста: <?=$post->getText()?><br>
Автор поста: <?=$post->getAuthor()->getName()?> <!-- это самое сложное -->
</html>
class Advert {
// Объявление детально
public function displayAdvert(){
// Показать объявление детально
}
}
public function displayMyAdverts(){
интерфейс гуманоид (декларация человекоподобного существа и декларация его базовых методов - идти, бежать, думать, размножаться)
-> абстрактный класс человек (имеет реализацию задекларированных в интерфейсе методов, имеет общую реализацию)
--> конкретный класс человек мужчина (частности реализации)
--> конкретный класс человек женщина (частности реализации)
-> абстрактный класс инопланетянин (имеет реализацию задекларированных в интерфейсе методов, имеет общую реализацию)
--> конкретный класс инопланетянин мужчина (частности реализации)
--> конкретный класс инопланетянин женщина (частности реализации)
Есть метод калькуляции заказа. Метод нужен во многих местах.в этом и ошибка - все в кучу. Надо сделать, что бы калькуляция была не черным ящиком, а настраиваемым удобным интерфейсом:
$discountCalculator = new discountCalculator(\ListItems $items);
$discountCalculator->addCondition(new SimpleDiscount());
$discountCalculator->addCondition(new BlackFridayDiscount());
$discountCalculator->addCondition(new ByDateDiscount('last day of this month'));
$discountCalculator->addCondition(new ApiDiscount());
$discountCalculator->calculate();
классы это просто способ организации кода насколько я понимаюнет. вообще не правильно понимаешь.
при выводе доски объявлений....некая сущность, назовём её Mapper, возвращает коллекцию объектов - объектов объявлений. Каждый объект == одно объявление. Объявление может иметь свойства - VIP-статус (дата конца этого статуса), типичные поля для объявления типа заголовок + текст. Далее, объявление может иметь изображения. Объект объявления имеет метод, который запрашивает у другой сущности объекты своих изображений, которые в свою очередь знают, как сформировать URl к изображению или иные характеристики изображений. Объект объявления имеет метод getPaymentSystem() - возвращается объект класса типа Kassa, он может возвратить объект Робокасса (или Frikassa), который умеет генерировать URL, который необходим для транзакции оплаты платных услуг данного объекта объявления....
я пока не понимаю как это использоватьи не поймешь без подсказок.
Для чего, в данном случае, возвращать объекты?Твой вопрос говорит о том, что ты не понимаешь разницу между объектом и массивом.
Чем мне это поможет на конкретном примере?ОК. Пример. Давай допустим, что твой объект Product не просто содержит свойства, а каждое свойство..... да - тоже является объеком. Итак, перепишем конструктор, добавим несколько свойств новых, для примера:
public function __construct(int $id, string $name, int $price, $decription, $discount_date){
$this->id = $id;
$this->name = new EntityText($name);
$this->price = new Price($price);
$this->decription = new EntityText($decription);
$this->discount_date = new MyDate($discount_date); // MyDate extends \Datetime
}
<html>
<div id="product<?=$obj->getId()?>">
<h1><?=$obj->getName()->getTextValue()?></h1>
<p>Цена: <?=$obj->getPrice()->getUSD()->asText()?></p> <!-- например, выведет "101 доллар США" (c правильной формой слова "доллар/доллара/долларов") -->
<p><?=$obj->getDescription()->getTextValue(200)?></p>
<p>Скидка действут <?=$obj->getDiscountDate()->formatAsHuman()?></p> <!-- выведет "еще 2 дня" -->
</div>
</html>
$product = new Product();
$product->setData($data); // $data - массив со значениями.
// Берем ключи каждого элемента $data, приводим к camelCase, пытаемся найти такой set-метод
// в объекте product и вызвать его с относящимся к ключу значением
print_r($product->getModelErrors()); // проверяем, насколько корректно заполнен продукт
всё началось с фразы "никакой работы с БД не должно быть в модели".это правильно и это ты правильно понял, абстрагировав слой БД от слоя модели. Советую почитать книгу Фаулера "Архитектуру корп. пр. приложений" и особенно главу "Источники данных". Без этой концепции ты дальше своей подделки не уедешь в знаниях.