Ответы пользователя по тегу ООП
  • Является ли чтение Readonly свойств объекта нарушением инкапсуляции?

    php666
    @php666
    PHP-макака
    showStruct(): DTO будет ли это являться нарушением инкапсуляции?
    нет.

    showStruct() максимум, что может вывести - это свойства объекта скопом, те в массиве. Это все равно, что пройтись по всем его геттерам и получить все свойства объекта DTO. Ибо по определению DTO тупой и пустой как барабан, вся его суть - получить данные откуда-либо, быть заполненным и передать этот DTO в другой слой ПО, который гарантированно получить все необходимые свойства, указанные в объекте.
    Ответ написан
    Комментировать
  • Может кто-нибудь дать реальную задачу на которой можно применить ООП?

    php666
    @php666
    PHP-макака
    вот же людям не лень писать портянки каждому новичку на одни и теже вопросы..

    гради буч объектно-ориентированный анализ и проектирование
    Ответ написан
    Комментировать
  • Почему не сохраняется присвоенное переменной класса значение?

    php666
    @php666
    PHP-макака
    На этот говнокод невозможно смотреть, у меня кровь из глаз пошла.

    Давай ты для начала
    1. Почитаешь об автозагрузке классов
    2. Перестанешь писать require в методах и почитаешь про внедрение зависимостей.
    3. Перестанешь использовать собаку @ там, где это не требуется. А именно в условии if (@$_REQUEST['select']) , для этого есть функции isset и empty.
    4. Внятно сформулируешь свой вопрос без кучи этого околорабочего кода и напишешь небольшой класс, описав проблемы с геттерами и сеттерами.
    Ответ написан
    4 комментария
  • Как правильно реализовать автозагрузку в PHP, не жертвуя использованием use?

    php666
    @php666
    PHP-макака
    Переформулируй свой вопрос.
    Ничего не понятно.
    Автозагрузка и пространства имен никак не связаны, в чем конкретно затык?
    Что значит
    Я не могу использовать use, что меня сильно напрягает
    Ответ написан
    5 комментариев
  • Можете привести пример, когда использовать private, а когда protected?

    php666
    @php666
    PHP-макака
    Мамкины ответчики, написавшие про то, что везде должен быть private, умных книжек не читали, кроме сухой теории и что-то своё, судя по всему, не разрабатывали.

    Класс почти ВСЕГДА должен иметь protected свойства. Ибо они ничем не отличаются от private, но позволяют использовать свойства в классах-наследниках, которые очень часто возникают. И что бы не переписывать код, лучше всегда использовать protected.

    Ситуация, когда действительно нужен private-метод или свойство - очень редкое явление.
    Ответ написан
    4 комментария
  • Правильно ли я нарисовал план ООП игры шашки?

    php666
    @php666
    PHP-макака
    Изучаю ООП. Хотел попробовать написать игру шашки

    1. Изучать ООП на Жс не лучшая идея, возьми тот же пхп.
    2. Писать столь сложную игру, как шашки, да ещё и на ООП - не самая тривиальная задача для обучения
    Ответ написан
    Комментировать
  • Зачем нужно ООП?

    php666
    @php666
    PHP-макака
    Все очень просто.
    Представь наш мир, который НЕ поделен на объекты:

    Представь, например, автомобиль, у которого двигатель приварен к кузову, генератор приварен к двигателю, а колеса приварены напрямую к ступичному узлу. Как ты колесо поменяешь? Да в общем-то никак.

    Представь, например, строение компьютера, где всё железо - это один монолитный блок. Допустим, у тебя повредилась какая-нибудь незначительная деталь - разъем для USB. Всё - компьютер за 50 круб в помойку?

    Объекты позволяют компоновать задачи отдельных сущностей (автомобильный двигатель, материнская плата ПК), что бы множество таких объектов обеспечивало механизм работы того или иного устройства. Это в реальном мире.

    Так же и в программировании. Большая задача разбивается на подзадачи, бизнес-логика компонуется по объектам, что обеспечивает для разработчиков простоту поддержки и "долговечность" такого кода.
    Ответ написан
    Комментировать
  • Что здесь лучше использовать? Простое наследование, интерфейсы, или вообще абстрактный класс?

    php666
    @php666
    PHP-макака
    выложи в отдельной теме код, ты оч много вопросов задаешь, явно видно, что стараешься, но упорно клонишь куда-то не туда в архитектуре... надо посмотреть что ты делаешь, может помогут заранее избавить тебя от плохой архитектуры.

    И фаулера главу "источники данных" ты не читал, да?
    Ответ написан
  • Как сделать страничку с сохраненными данными php, ООП?

    php666
    @php666
    PHP-макака
    сейчас обучаюсь на курсах по Web-програмированию и сейчас вообще не понимаю как работать с ООП
    к ООП ты придешь сам, но спустя некоторое время практики (год-два). Когда тебе не потребуются курсы, что бы писать на языке. Сейчас что-либо тебе объяснять бесполезно. И не нужно. Научись писать сначала код без самописных классов.

    И как можно сделать страничку с сохранеными данными через ооп?
    Это тема если и не целой книги, то большого раздела в книге.
    Ответ написан
    6 комментариев
  • Как правильно получить составные данные из базы и сложить их в одну сущность?

    php666
    @php666
    PHP-макака
    PostsView, который отвечает за вывод поста в виде HTML
    никакого PostsView быть не должно - достаточного одного View - это, по сути, шаблонизатор, с буферизацией вывода. Что, по твоему, должен делать PostsView?

    Что почитать по этой теме
    "Архитектуру корпоративных приложений" Фаулера. Главу "источники данных".

    Ведь мы не можем просто взять и в PostsModel выполнить JOIN необходимых полей из таблицы Users?
    Я в своем самописном фреймворке так и сделал. Есть метод для JOIN в моей ORM, он возвращает многомерный массив объектов, где каждый конечный элемент (на твоем примере) будет объект модели Поста и Пользователя. Почему так? Потому, что сделать так:

    <html>
      Текст поста: <?=$post->getText()?><br>
      Автор поста:  <?=$post->getAuthor()->getName()?> <!-- это самое сложное -->
    </html>


    - сделать своими силами - очень, очень нетривиальная задача.
    Ответ написан
    Комментировать
  • Набросал структуру классов учебного сайта доски объявлений, как еще лучше распределить функционал?

    php666
    @php666
    PHP-макака
    Я проектировал доску с нуля на ООП.
    Я бы написал расширенный ответ, но лень.
    Надо просто читать Фаулера, я говорил тебе 100 раз. Ты этого не делаешь, поэтому ты пишешь какую-то вроде отчасти и правильную вещь, но если разложить по полочкам - сам не понимаешь. что хочешь добиться в архитектуре. В итоге сам не понимаешь, куда движешься. У тебя НЕТ архитектуры и понимания, как сделать правильно, поэтому мечешься. А архитектура - это когда шаг влево, шаг вправо - расстрел. Это когда ты делаешь всё по оговоренным правилам и не задаешься вопросами, а как правильно.

    class Advert {
      // Объявление детально
      public function displayAdvert(){
        // Показать объявление детально
      }
    }


    какая-то дичь. Ты должен оперировать в первую очередь контроллером, моделью, представлением. Модель - это классы сущностей и сервисы. Во многих популярных фреймворках модель - это сущность+ActiveRecord. Можно использовать паттерн модель + DataMapper. Не суть.

    Вот что такое Advert? Это объявление. Это модель. У нее нет никакого метода displayAdvert. Этот метод может быть у контроллера объявлений, который выводит ОДНО объявление на странице.
    Что, по твоей логике, должен делать этот метод? Чем он отличается от метода ХРАНИЛИЩЕ::findById()?

    public function displayMyAdverts(){
    Это должно быть в AdvertCollection::findByUser()
    Ответ написан
    Комментировать
  • Зачем нужны абстрактные классы и интерфейсы в php?

    php666
    @php666
    PHP-макака
    так яснее?

    интерфейс гуманоид (декларация человекоподобного существа и декларация его базовых методов - идти, бежать, думать, размножаться)
    
    -> абстрактный класс человек (имеет реализацию задекларированных в интерфейсе методов, имеет общую реализацию)
     -->  конкретный класс человек мужчина (частности реализации)
     -->  конкретный класс человек женщина (частности реализации)
    
    -> абстрактный класс инопланетянин (имеет реализацию задекларированных в интерфейсе методов, имеет общую реализацию)
     -->  конкретный класс инопланетянин мужчина (частности реализации)
     -->  конкретный класс инопланетянин женщина (частности реализации)


    Если ты был бы создателем, тебе потребовалась именно эта структура для создания гуманоидо-образного существа (две руки, две ноги, голова, прямоходящий, два глаза - это ИНТЕРФЕЙС - декларация, что все классы будут имплементировать это соглашение).

    Человек не может наследоваться от инопланетянина, как и наоборот - это РАЗНЫЕ формы жизни. Одна построена на углеродной форме (человек), другая, скажем, на базе метаногенов. Но общее их - интерфейс ГУМАНОИД, созданный "по образу и подобию" (с).

    Для этих двух разных типов мы создаем базовые АБСТРАКТНЫЕ классы (ибо ни человек, ни инопланетянин, с нашей точки зрения, как создателя, не может быть неопределенного пола). В абстрактных классах мы реализуем методы, которые задекларированы в нашем интерфейсе. Мы наполняем абстрактные классы свойствами и всеми методами, присущими обоим полам наших творений, ведь между мужчиной и женщиной очень много общего в строении.

    Конкретные классы уже являются конечными полами двух разных типов форм жизни.

    24301509.jpg
    Ответ написан
    2 комментария
  • Где посмотреть\почитать нормальные уроки по ООП в PHP?

    php666
    @php666
    PHP-макака
    Надо не уроки смотреть всяких идиотов, а читать книги людей, чье мнение признано сообществом и которые написали книги.
    Гради Буч - для освоение сути ООП
    Мартин Фаулер - про архитектуру, про CRUD, про доменные объекты. Одной этой книги достаточно, что бы прокачать себя так, что ни один видеокурс в жизни не сделает.

    Иначе твои познания будут соответствовать уровню этих уроков, которые создаются лишь с целью срубить с лохов бабла.
    Ответ написан
    15 комментариев
  • Как верно заархитектурить заказ?

    php666
    @php666
    PHP-макака
    Есть метод калькуляции заказа. Метод нужен во многих местах.
    в этом и ошибка - все в кучу. Надо сделать, что бы калькуляция была не черным ящиком, а настраиваемым удобным интерфейсом:
    $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();
    Ответ написан
    6 комментариев
  • Можно ли это переписать на ООП? И как примерно всё это можно распределить по классам?

    php666
    @php666
    PHP-макака
    классы это просто способ организации кода насколько я понимаю
    нет. вообще не правильно понимаешь.

    Я тебе уже советовал читать Фаулера, ты это сделал? Ты задаешь одни и те же вопросы, на которые в принципе никто не сможет тебе ответить - это тема целой книги. Все советы тут будут лишь медвежьей услугой.

    У тебя два пути:
    1. Брать фреймворк и писать с нуля
    2. Читать книгу и изобретать велосипед, переписывая свою лапшу на оо-стиль. Прокачаешься, но времени потратишь оооочень много, что будет крайне сомнительным действием в плане профита.
    Ответ написан
  • Как получить множество объектов одной модели?

    php666
    @php666
    PHP-макака
    Однозначно первый вариант.

    Для поиска коллекций, одиночных объектов и в целом для CRUD, лучше посмотреть в сторону DataMapper - он абстрагирует объекты модели от СУБД. Это очень удобно:

    datamapper.png
    Ответ написан
    Комментировать
  • Где взять реальные примеры кода использования ооп в веб-сервисах?

    php666
    @php666
    PHP-макака
    при выводе доски объявлений
    ....некая сущность, назовём её Mapper, возвращает коллекцию объектов - объектов объявлений. Каждый объект == одно объявление. Объявление может иметь свойства - VIP-статус (дата конца этого статуса), типичные поля для объявления типа заголовок + текст. Далее, объявление может иметь изображения. Объект объявления имеет метод, который запрашивает у другой сущности объекты своих изображений, которые в свою очередь знают, как сформировать URl к изображению или иные характеристики изображений. Объект объявления имеет метод getPaymentSystem() - возвращается объект класса типа Kassa, он может возвратить объект Робокасса (или Frikassa), который умеет генерировать URL, который необходим для транзакции оплаты платных услуг данного объекта объявления....

    --- это лишь малая описательная часть. Как пример.

    я пока не понимаю как это использовать
    и не поймешь без подсказок.
    Твоя цель - открыть книгу "мартин фаулер архитектура корпоративных программных приложений pdf" почитать минимум 1, 2, 9 и 10 главу.
    Ответ написан
    8 комментариев
  • В чем отличие возвращаемого массива от объектов?

    php666
    @php666
    PHP-макака
    Для чего, в данном случае, возвращать объекты?
    Твой вопрос говорит о том, что ты не понимаешь разницу между объектом и массивом.

    Это не одно и тоже.
    Объект - это не просто хранилище данных, как массив.
    Объект - это описание некой сущности, представление этой сущности в рамках языка программирования. Объект может иметь свойства и методы, оперирующие этими свойствами или методы, делающие еще что-либо, что касается непосредственно этого объекта.

    Прочти хот-бы пол книги "Гради Буч - Объектно-ориентированный анализ и проектирование". И ты перестанешь задавать эти детские вопросы.

    Чем мне это поможет на конкретном примере?
    ОК. Пример. Давай допустим, что твой объект 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
      }


    Требование к одной из страниц магазина, показывающего продукт: нужно отображать цену в RUB и в USD. Текст описания не должен быть более 200 символов. Показать дату окончания скидки в человеческом формате.

    <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>


    Теперь вопрос: как это будет выглядеть на массивах? Разницу видишь?

    и начинай читать отсюда- https://dom-knig.com/read_210105-3
    Ответ написан
  • Как создавать объект с большим количеством свойств?

    php666
    @php666
    PHP-макака
    $product = new Product();
    $product->setData($data); // $data - массив со значениями. 
    // Берем ключи каждого элемента $data, приводим к camelCase, пытаемся найти такой set-метод 
    // в объекте product и вызвать его с относящимся к ключу значением
    print_r($product->getModelErrors()); // проверяем, насколько корректно заполнен продукт

    как работает getModelErrors: у класса product есть некая карта допустимых свойств модели. Обязательное ли свойство или нет. Если нет, то какое дефолтное значение. Можно навесить валидацию на каждое из описанных свойств. Т.е. создать систему валидаторов и к каждому свойству применять от 0 до бесконечного множества различных валидаторов. У меня в фреймворке это сделано так.
    Ответ написан
    Комментировать
  • Хорошо ли написан класс БД?

    php666
    @php666
    PHP-макака
    1. Мое личное мнение - использовать PDO как движок для своей обертки - очень плохая идея. PDO универсален, тем самым он ограничивает многие возможности. По сути, это весьма усложненная и неторопливая махина.

    2. Метод query до неприличия простой. Я не вижу тут никаких плюшек, нет ни одного преимущества обертки над самим PDO. Я писал много времени обертку над MySql, можешь посмотреть, что обычно добавляется к возможностям.

    3. У обертки не должно быть методов типа getRows, getColumn и тп. отсебятины. Её функция - обрабатывать запросы, отдавать ответы и какие-то вспомогательные функции, типа lastInsertId и отдавать ошибки. Все остальное должно реализовываться в вышестоящем слое, неважно как ты его назовешь.

    4.
    всё началось с фразы "никакой работы с БД не должно быть в модели".
    это правильно и это ты правильно понял, абстрагировав слой БД от слоя модели. Советую почитать книгу Фаулера "Архитектуру корп. пр. приложений" и особенно главу "Источники данных". Без этой концепции ты дальше своей подделки не уедешь в знаниях.
    Ответ написан
    7 комментариев