Ответы пользователя по тегу PHP
  • Не всегда же называть методы глаголами?

    qonand
    @qonand
    Software Engineer
    судя по всему у Вас методы устанавливают значения соответствующих свойств.
    Для таких методов принято формировать названия с префиксом set, например: setEvent (установить событие), setDate(установить дату)

    Что касается приведенного фрагмента: это базовый класс Yii фреймворка, а сам по себе код этого фреймворка желает лучшего, с точки зрения соответствия различным практикам программирования. Давайте забудем что это за фреймворк, забудем все что описано в документации по нему, и посмотрим на этот код просто с точки зрения ООП, глазами человека не привязанного к какому-то конкретному инструменту. Например, возьмем метод alias(). Что мы можем сказать о этом методе? Мы можем сказать что в этом методе что-то делается с псевдонимом. Но что конкретно делает этот метод? за что он отвечает? Исходя из его названия - мы ничего о этом сказать не можем, т.к. такое название неочевидно.
    Ответ написан
    4 комментария
  • Что нужно возвращать: null или false?

    qonand
    @qonand
    Software Engineer
    в подобных ситуация стоит возвращать null или Null-object в зависимости от того как реагирует Ваш код на ситуацию когда ничего не найдено. Бросать исключение в таких ситуациях - не особо уместно, все таки "не найдено" это не исключительная ситуация а вполне себе обычная... возвращать false - тоже как-то не камельфо (если есть false должен быть и true)
    Ответ написан
    Комментировать
  • Шаблон проектирования - посредник (Mediator) объясните на простейшем примере как он работает?

    qonand
    @qonand
    Software Engineer
    постоянно забываю паттерны, и время от времени освежаю их в памяти

    да и не стоит забивать голову лишней информацией и запоминать их все и во всех подробностях. Достаточно понимать какие они есть и какие задачи каждый из них решает. А при необходимости уже смотреть более конкретную информацию по ним.
    По GoF-паттернам могу посоветовать designpatternsphp.readthedocs.io/ru/latest/Behavio...
    Ответ написан
  • Как прекратить создавать объекты классов?

    qonand
    @qonand
    Software Engineer
    Проблема Вашего кода это сильная связанность со всеми вытекающими. В такой ситуации как минимум стоит применить SOLID-принципы, как максимум - переработать архитектуру приложения (но тут конечно все зависит от масштаба проекта).

    Рекомендую почитать:
    Robert Martin - Agile Software Development, Principles, Patterns and Practices
    Martin Fowler - Patterns of Enterprise Application Architecture
    Ответ написан
  • У кого есть подборка крутых программистов PHP — блоги, каналы, соцсети?

    qonand
    @qonand
    Software Engineer
    Вот не плохая подборочка людей за которыми стоит "наблюдать" https://github.com/marcelgsantos/learning-oop-in-p... - правда не все тут из мира php, но тем не менее на них тоже не мешает подписаться
    Ответ написан
    7 комментариев
  • Как правильно разделить классы в ООП PHP?

    qonand
    @qonand
    Software Engineer
    так вот вопрос в следующем, можно ли в одном файле хранить 2 класса? Насколько это правильно?

    Нет. это не правильно. Ссылки на стандарты описывающие это привел Дмитрий Энтелис
    1. Файл database.php - в нем хранится клас и функции для работы с БД.
    2. Файл run.php - там хранятся функции для работы с с каждой строкой из БД (можно сказать основной файл)
    3. Файл api.php - функции сторонних сервисов, необходим для run.php
    4. Файл config.php - ну тут все понятно чисто переменнные для работы
    5. Файл index.php - основной который запускает и объединяет все.

    Судя по тому что Вы приводите список файлов с функциональной декомпозицией могу предположить что и в самих файлах у Вас не ООП-код (использование классов это еще не означает ООП). Поэтому рекомендую пройти какие-нибудь курсы по ООП либо почитать соответствующие книги.
    И еще вопрос обязательно ли использовать ООП или это зависит от каких то факторов(например показывает уромень автора)?

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

    qonand
    @qonand
    Software Engineer
    Если правильно понимаю у Вас две проблемы:
    1. Вы не знаете как считывать данные из параметров дочерних классов и подставлять их в Ваши запросы.
    2. Вы не знаете как заполнить данными параметры дочерних классов полученными из SQL-запроса
    За подобного рода преобразования должны отвечать дочерние классы, а родительские класс должен только использовать эти преобразования. Соответственно Вам нужно создать два абстрактных метода реализующих для каждого потомка свои механизмы преобразования.

    P.S. почитайте про паттерн Active Record, по сути дела Вы пытаетесь его повторить в некой своей интерпретации
    Ответ написан
    2 комментария
  • Почему условия пропускает элементы?

    qonand
    @qonand
    Software Engineer
    Подскажите пожалуйста что я делаю не так, заранее благодарю за ответ.

    Пишите говкод в котором и сами не можете разобраться и надеетесь что придет добрый человек и тыкнет носом где в этой каше проблема.
    Поэтому мой Вам совет - подучите матчасть, почитайте книжки разные по программированию не будет таких вопросов
    Ответ написан
    Комментировать
  • Как правильно вызывать функцию класса внутри класса?

    qonand
    @qonand
    Software Engineer
    обычные методы с помощь $this->method(), статические с помощь static::method()
    почему в Вашем случае возникала ошибка при использовании $this сложно сказать, нужно смотреть больше кода. Судя по коду приложенному в вопросе - проблем быть не должно. Скорее всего Вы что где-то не так делаете
    Ответ написан
    4 комментария
  • Класс как аргумент функции, как это использовать?

    qonand
    @qonand
    Software Engineer
    что это вообще такое, как гуглить, где читать?

    Это обычная функция обратного вызова реализованная через анонимную функцию. Гуглить соответственно по словам "функция обратного вызова", "Анонимная функция". Читать статьи в интернете, книги по основам программирования ...
    Будет неплохо, если будут примеры или толковые объяснения

    Ищите в интернете, по этой теме не мало материалов есть. Или запишитесь на какие-нибудь толковые курсы по основам программирования на которых Вам и объяснят и примеры приведут
    Есть подозрения, что это как-то связано с паттернами проектирования.

    Еще раз - это основы и они имеют такое же отношения к паттернам как и циклы, условия и т.п. т.е. никакое.
    Ответ написан
    Комментировать
  • Как правильно написать 2 цикла php foreach?

    qonand
    @qonand
    Software Engineer
    <?php foreach ( $values as $clone ): ?>
        <div class="new-item">
        <?php foreach ( $clone as $value ) :?>
            <div class="new-item__name"><?=$value['name'];?></div>
            <div class="new-item__adress"><?=$value['address'];?></div>
            <div class="new-item__email"><?=$value['email'];?></div>
        <?php endforeach; ?>
        </div>
    <?php endforeach; ?>
    Ответ написан
    Комментировать
  • Для чего нужно создавать собственные try catch?

    qonand
    @qonand
    Software Engineer
    Что такое исключение? Это механизм который, грубо говоря, сообщает что в системе что-то пошло не так, код отработал не так как нужно
    Зачем нужен перехват исключений (try ... catch)? для того что бы отловить ситуации в которых что-то пошло не так и как-то отреагировать на них, например постараться решить возникшую проблему
    Зачем нужна иерархия исключений реализуемая через наследование? В системе может возникнуть множество ситуаций когда что-то пошло не так и на каждую из таких ситуация возможно будет необходима своя реакция. Вот именно для таких случаев и реализуется иерархия исключений, каждый класс исключения - описывает определенную ситуацию, а перехвачивая исключения соответственно ловит только определенный класс
    Ответ написан
    Комментировать
  • Как к дате добавить один год и вычесть день?

    qonand
    @qonand
    Software Engineer
    $newDate = date_create_from_format('Y-m-d', $date);
    $newDate->modify('+1 YEAR -1 DAY');
    echo $newDate->format('d.m.Y');
    Ответ написан
    1 комментарий
  • Как обрабатывать добавление поста в классах?

    qonand
    @qonand
    Software Engineer
    ох Вы с названиями и ответственностью классов намудрили, давайте по порядку
    Есть модель ModelPosts, в которой мы получаем все из базы данных.

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

    Есть объект Post, в котором обычно помещаются данные о посте, после их получения из БД (но у себя в голове никак не могу его определить куда-то при добавлении поста, получается этот объект никак не участвует в добавлении)

    А этот класс по сути дела обычная сущность хранящая в себе данные. Вот этот то класс и должен быть моделью (или ее частью) т.е. не только содержать данные но и реализовывать какую-нибудь бизнес-логику. Модель это уровень бизнес-логики.

    Добавление поста - это что? в общем случае это просто выполнение определенного запроса к базе данных. А что отвечает за взаимодействие с базой данных? Уровень доступа к данным, в нашем случае это класс ModelPosts (вообще-то не удачное название). Соответственно в нем и должна быть реализация добавления поста в базу данных.

    Что касается валидации - реализация механизма валидации должна содержаться в отдельном классе (или классах). Сама валидация может происходить либо в контроллере, либо в модели
    Ответ написан
    Комментировать
  • Как вставить в базу данных элементы из массива?

    qonand
    @qonand
    Software Engineer
    1. пройтись циклом по массивам
    2. сформировать INSERT-запрос c помощью итераций цикла
    3. выполнить запрос с помощью инструмента, через который Вы работаете с базой данных
    Ответ написан
    1 комментарий
  • Какой шаблон проектирования больше подходит для загрузки связанных сущностей?

    qonand
    @qonand
    Software Engineer
    1. Как-то у Вас сущности живут отдельной жизнью друг от друга. По сути сейчас Вы перенесли структуру своей базы данных на объекты, а это не правильно. Сущность заказа должна агрегировать в себя сущности позиций заказа и покупателя, а не просто содержать их идентификаторы. Например:
    class OrderEntity
    {
        /**
         * @var integer Идентификатор заказа
         */
        protected $id;
        
        /**
         * @var MemberEntity Объект покупателя
         */
        protected $member;
        
        /**
         * @var ItemEntity Массив позиций заказа
        protected $items = [];
    }

    2. Получение данных из базы данных в объект должно быть реализовано в каком-нибудь репозитории или в каком-нибудь датамаппере. Почитайте про эти паттерны. Но вообще лучше взять какую-нибудь вменяемую ORM что бы избежать кучи гемора.
    3. По названиям классам - не добавляйте в них суфикс Entity, код становиться из-за этого более нагроможденным, лучше используйте пространства имен
    Ответ написан
    3 комментария
  • Рекомендации по использованию трейтов в PHP?

    qonand
    @qonand
    Software Engineer
    Лезу в класс Main и вижу что метода sayHelloWorld в нём нет. Логически понятно что он не в родителе т.к. было бы другое обращение (через parent::) но это всё равно несколько сбивает с толку, особенно если слово use не сразу заметишь

    Установите нормальное IDE и не будет никаких проблем, например в том же PHPStorm кликнув на методе Вы сразу можете перейти к его реализации без лишних поисков и телодвижений

    Есть ли какие-то best practice и негласные соглашения по их использованию, например писать метод $o->sayHelloWorldTrait(); тогда уже по названию метода понятно и что он делает и откуда берётся.

    Ой сомневаюсь, ибо смысла в них нет. Название метода эта часть интерфейса класса, а трейт он как бы не относиться к описанию интерфейса. Трейт это инструмент позволяющий избавиться от дублирования функционала и не более того.

    В какой папке хранить трейты если папки проекта разделены на model, view, controller?

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

    Вопрос по статическим членам трейта

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

    qonand
    @qonand
    Software Engineer
    в данном случае создастся экземпляр класса Foo, т.к. Вы не используете позднее статическое связывание. Соответственно если хотите что бы создавался экземпляр класса Bar используйте его, например:
    class Foo
    {
        static public function create() {
            return new static();
        }
    }


    P.S. и лучше у методов явно указывать модификаторы доступа
    Ответ написан
    Комментировать
  • PHP нужен ли пробел?

    qonand
    @qonand
    Software Engineer
    Правильно так как принято в стандарте который Вы используете. Если Вы используете PSR - правильно без пробела, если Вы используете какой-то внутренний стандарт компании в котором обязателен пробел - значит нужно его ставить.

    Итог: Нужно просто соблюдать правила используемого Вами стандарта
    Ответ написан
    Комментировать