За последние 24 часа нас посетили 21812 программистов и 1016 роботов. Сейчас ищут 674 программиста ...

Как лучше структурировать код?

Тема в разделе "PHP для новичков", создана пользователем Nerfed, 2 мар 2019.

  1. Nerfed

    Nerfed Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Здрасьте. Научите писать красиво громоздкие штуки. Сейчас я делаю так - у меня есть центральный файл common.php с классом common. Внутри лежат всякие базовые методы для работы с БД, текстом, датами и прочим - то что используется везде. А ещё в конструкторе этого класса инициализируется всё необходимое типа подключения к БД и вытаскивание id текущего юзера. Дальше я на этот метод наращиваю другие классы таким способом:
    PHP:
    1. class foo extends common {
    2. }
    3. class bar extends common {
    4. }
    Это создаёт неудобства. Например, если я в классе foo использую какой-то метод из bar, то потом в этих методах из bar я не могу использовать класс foo. Получается бесконечный цикл. К тому же, конструктор common стреляет каждый раз, что тоже не есть хорошо. И ещё во всех классах в $this видны все public-методы из common. Это было удобно, пока методов в common было мало, но потом это начало выносить мозг. Какие есть варианты структурировать это всё получше?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну так логично, не правильно используешь наследование. Вынеси эти все общие задачи в отдельные классы, их экземпляры сложи в Service Locator (гугли), или, что лучше, в Dependency Injection Container (опять же, гугли). Для PHP есть пакеты с готовыми DI-контейнерами.

    А вообще, надо книги по ООП читать, в одном посту это не опишешь. Прочти книгу Мэтта Зандстры, к примеру. А так, скажи, что уже читал, что знаешь.
    --- Добавлено ---
    Вот этот сайт почитай: https://designpatternsphp.readthedocs.io/ru
     
    Nerfed нравится это.
  3. Nerfed

    Nerfed Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @mkramer Я читал только книгу по PHP 5 Котерова и Костарева. Ссылка не открывается, я так понимаю это то что мне нужно. Почитал - слишком много непонятных слов в определениях. Мне бы начать с чего попроще. Не так давно я писал в процедурном стиле вообще, но начал оборачивать код в классы, когда столкнулся с проблемой пересечения имён переменных. Ещё даже неймспейсы не изучил.
     
    #3 Nerfed, 2 мар 2019
    Последнее редактирование: 2 мар 2019
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    https://www.ozon.ru/context/detail/id/5648968/ - вот эту книгу почитай обязательно, сайт - просто каталог паттернов, а в книге они подробнее расписаны
     
    Valick нравится это.
  5. Nerfed

    Nerfed Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @mkramer Спс, почитаю. А там фреймворки обязательны для достижения желаемого результата? Я стараюсь придерживаться принципов KISS и считаю такой себе идеей нагромождать фреймворк, когда у тебя за основу взята CMS. Хочу научиться делать грамотную структуру, при этом максимально простую и на голом PHP.
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Nerfed, нет там фреймворков
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну лично я несколько лет все проекты делаю на фреймворках, потому что мне лень писать свой роутер, свой DI-контейнер и прочее, прочее, прочее. Что-то более-менее крупное - на Yii2 или Laravel, что-то мелкое - на Slim, который, в принципе, кроме роутера, ничего и не даёт. Не скажу, что это как-то усложняет жизнь. Но они не обязательны. Хотя, если бы я писал без фреймворков, я бы всё равно взял готовый хотя бы роутер и DI-контейнер. Вот отсюда, к примеру: https://thephpleague.com/

    Вообще, почему появились фреймворки? Потому что в каждом проекте приходится решать ряд стандартных задач:
    • Роутинг (без него можно, но с единой точной входа живётся лучше)
    • Работа с БД (да, есть PDO или mysqli, но я там не могу написать (new Query)->from("table")->where(["field"=> $_GET["a"]])->orderBy("field2", SORT_DESC)->limit(10)->all(), а это удобнее, читаемее, экономит время, плюс скрывает внутри себя всю дурацкую, но необходимую возню с плейсхолдерами и экранированием). Плюс есть задачи с БД, которые тоже постоянно появляются, и хотелось бы их иметь решёнными, например, та же пагинация, или маппинг базы данных на объекты бизнес-логики
    • Работа с шаблонами (ну мы же любим MVC)
    Ну это то, что нужно практически в каждом проекте. И если ты не используешь чужой фреймворк, тебе нужно написать свой, чтоб всё это не повторять с нуля каждый раз. Не знаю, как ты, но лично я сомневаюсь, что у меня получится лучше, чем Laravel или Yii2

    Как-то так
    --- Добавлено ---
    И да, в книге Зандстры, как написал @Valick фреймворков нет
     
    Valick нравится это.
  8. Nerfed

    Nerfed Активный пользователь

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @mkramer Все фреймворки для меня пока выглядят страшно, потому что там другой синтаксис. Это как изучать PHP заново. Пожалуй, лучше сначала изучу сам PHP хотя бы до неймспейсов и автолоудеров. Почитаю Мэтта Зандстру сначала, попрактикую его решения, а там будет видно куда двигаться дальше. Роутинг - у меня сейчас реализован в CMS, которую я беру за основу. Это либо Wordpress, либо Concrete5, а свой код я добавляю в виде плагина.
     
  9. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Nerfed я начинал изучать php с Codeigniter, а javascript с Jquery. Так что, главное начать изучать, не так важно с чего =)
     
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, лучше б ты php начинал изучать с php. :) А то иногда такую фиговину пишешь, что страшно даже читать, не то что вникать в то что там написано.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну это то как раз нормально, я достаточно долго вордпрессом кормился. И даже недавно в течение года разработал и поддерживал плагин для одной известной CPA-сети (называть не буду). Но всегда наступает предел, когда даже самая лучшая CMS уже не справится. У WordPress он наступает достаточно быстро, кстати, поскольку он проектировался как узко-специализированное решение. У Content5 может он и дальше, но он всё равно есть
     
  12. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Valick прогресс идет, все нормально =)