Skip to content

Реальное собеседование на PHP-разработчика в 2026

Реальное собеседование на PHP-разработчика с уклоном на WordPress в 2026 году. Опыт, задачи, менторство и советы от Михаила.

Key Takeaways

  • Рынок PHP-разработчиков в 2026 году становится более конкурентным с меньшим количеством вакансий.
  • Менторство и персональное сопровождение важнее простых курсов для развития IT-специалистов.
  • Практический опыт и знание современных инструментов (Git, CI/CD, таск-трекеры) критичны для успешного трудоустройства.
  • Реальные проекты часто требуют комплексных решений, например, для AI и обработки видео на PHP.
  • Использование Docker и WSL становится стандартом для локальной разработки PHP.

What the video covers

  • Михаил делится опытом прохождения реального собеседования на PHP-разработчика с акцентом на WordPress.
  • Обсуждается ситуация на рынке труда для PHP-разработчиков в 2026 году, снижение количества вакансий и важность менторства.
  • Представлена новая платформа Webtalk для общения и менторства с Михаилом, включая абонементы и доступ к курсам.
  • Подробный разбор опыта кандидата: 9 лет в коммерческой разработке, работа с Laravel, WordPress, Drupal, Magento и фронтендом.
  • Обсуждаются командные процессы, использование GitLab, GitHub, CI/CD, таск-трекеры (Notion, DbRains).
  • Приведен пример сложного проекта с AI-переводом и дубляжом видео на PHP, решение технических задач качества видео.
  • Описание локального окружения для разработки: Windows, WSL, Docker, PHPStorm и WebStorm.
  • Рассмотрены технические вопросы по PHP, архитектуре, работе с базами данных и WordPress хуками.
  • Обсуждение ошибок SQL и особенностей работы с внешними ключами.
  • В видео есть мемы и советы по подписке на Телеграм-канал и сообщество для разработчиков.

Answers

Questions about this video

Какова текущая ситуация на рынке труда для PHP-разработчиков в 2026 году?

Рынок стал более конкурентным, количество вакансий уменьшилось, но хорошие компании и отклики всё ещё есть. Требуется больше усилий для поиска работы.

Что такое Webtalk и как он помогает разработчикам?

Webtalk — это платформа для менторства и общения с Михаилом, где можно бронировать встречи, общаться в чате и получать доступ к курсам для поддержки в IT.

Какие инструменты и технологии использует кандидат для разработки?

Кандидат работает на Windows с WSL, использует Docker для проектов на PHP, редакторы PHPStorm и WebStorm, а также системы контроля версий GitLab и GitHub с CI/CD.

Full Transcript — Download SRT & Markdown

00:00
Speaker A
Всем привет. Меня зовут Михаил. Это проект Аб. И так сложилось в моей жизни, что несколько месяцев назад я проходил собеседование на PHP-разработчика с таким типом уклона на то, что в проекте будет WordPress. Это совершенно реальное собеседование на совершенно реальную
00:20
Speaker A
вакансию. Сразу скажу, что там вилка была в районе 150 000, поэтому в целом вы можете оценить, сколько и за что нынче платят. Супер-мегаважно подсветить то, что я не искал себе работу. Просто так сложились обстоятельства, что мне нужно было пройти. И по невероятно
00:37
Speaker A
счастливой случайности у меня ещё и получилось это нормально записать. Поэтому вы, наконец-то, хоть какой-то контент получите. Слишком много говорить не буду, но дам как бы свою оценку, потому что в целом сейчас происходит на нашем рынке. Если говорить про PHP
00:50
Speaker A
именно разработчиков, как и везде, есть не очень хорошая тенденция. Вакансий, очевидно, стало меньше. Откликаться приходится больше, но тем не менее, как видите, отклики есть, вакансии есть, компании на самом деле неплохие, достаточно надёжные, потому что, ну, они связаны с госструктурами. Я думаю, мы
01:09
Speaker A
все прекрасно понимаем, какие факторы на всё это влияют. Сделать с этим особо ничего мы не можем. Такова как бы ситуация и тенденция. Так, и ещё коли у меня есть немного времени поделиться новостями, многие из вас знают, что web
01:23
Speaker A
— это как бы про курсы было всегда, но я как-то несколько раз уже заявлял, что я хочу от этого отходить, потому что я считаю, что материал должен быть доступен тому, кому это действительно нужно. И после того, как я там провёл
01:38
Speaker A
некоторую ретроспективу, я понял, что сейчас в нынешней ситуации намного полезнее не материал, а скорее какое-то менторство, наставничеством, если это так можно сказать. Я просто не очень люблю эти термины, но тут, наверное, по-другому не скажешь. На самом деле, это всегда было актуально, просто до
01:55
Speaker A
меня это дошло только сейчас. И именно по этой как бы причине я решил запустить Webtalk. Это небольшая платформа, в рамках которой вы можете, собственно, пообщаться со мной на абсолютно любые темы, связанные с айтишкой. Может быть, какие-то в целом есть переживания,
02:11
Speaker A
хотите там обсудить. Я, конечно, не психолог, но поговорить с вами могу спокойно. Если вам нужно какое-то реально полноценное сопровождение, то есть абонемент. Когда вы его берёте, я с вами на протяжении целого месяца. Ну, по крайней мере, пока так будет, да.
02:27
Speaker A
Абонемент можно будет типа перевзять, но как бы сам он сам по себе он типа длится один месяц. В рамках абонемента вы можете бронировать встречи со мной. У вас есть доступ к чату, в рамках которого вы можете со мной общаться.
02:42
Speaker A
Также есть опция общения со мной в Телеге, чтобы было всем нам проще. Вам открывается доступ ко всем курсам, что есть на АAb, чтобы у вас под рукой были материалы и вы могли, собственно, что-нибудь изучать. В общем, не буду
02:54
Speaker A
сильно много там рассказывать всего. Переходите на лендинг, там всё есть. В принципе, это эксперимент как для меня, так и для вас. Я не знаю, во что это будет развиваться. Потяну ли я вообще чисто физически, если там возьмут несколько абонементов. Ну, посмотрим. Я
03:10
Speaker A
только рад пообщаться с людьми, посмотреть, какие сейчас есть проблемы, переживания у разработчиков и, в принципе, того, кто варится во всей этой движухе. И пару слов ещё про само собеседование. Значит, там постоянно у меня сверлил сосед, поэтому не ругайтесь
03:26
Speaker A
сильно на это. В пустые пространства, где как бы нечего было вставлять, я вам добавил мемы с котиками и собачками. А, ну и подписывайтесь на Телегу, там есть канал Web и есть сообщество Сам Код. В общем, подпишитесь, там киньте в
03:41
Speaker A
архивчик, но уведомления не отключайте. Периодически я там что-то пощу. Сейчас в целом из-за того, что я освободился наконец-то от некоторой работы, могу позволить себе потратить какое-то время на канал. Ну ладно, всё, я замолкаю.
03:54
Speaker A
Приятного вам просмотра. У меня к вам, знаете, какой вопрос. Вы на компе сейчас, вы сможете, ну я вам просто буду показывать картинки всякие, комиксы пичпишные, сможете посмотреть?
04:03
Speaker A
Да, конечно, потому что у меня, а, собес состоит из нескольких частей. Сначала мы с вами просто побеседуем, потом лёгкий скрининг такой быстрый-быстрый по PHP и потом уже такой чуть более глубже я буду картинки показывать, и вы будете говорить, что
04:17
Speaker A
думаете. Так вот, где-то по времени, где-то по времени приблизительно минут 40 будет. Пока можете опыт вкратце рассказать. Я прочитал ваше резюме.
04:25
Speaker A
Очень впечатляет большой объём. Понравилось то, что есть Ларавель. Кратко свой опыт своими словами, что делали, что интересного. Да, я только на днях посмотрел вообще таймлайн, сколько я уже в коммерческой разработке, там 9 лет.
04:39
Speaker A
9 лет там у вас было написано. Да, да, я сам немного офигел, как время быстро летит. Ну, на самом деле, да, бэкграунд достаточно большой. Я работал с разными технологиями, из по бку это в основном был. По если симэски много
04:55
Speaker A
работал с WordPress, с Drupal, там даже Magento какую-то затронул, много с чем, короче, взаимодействовал.
05:01
Speaker A
Э, и также с фронтом доводилось работать в своё время даже очень много. А вообще опыт командной работы есть у вас? Вот, э, как бы, ну, в команде там вот всякие там мёрж реквесты, там GitLab, там вот это всё вот совместное
05:18
Speaker A
обсуждение. Да, да, у меня по сути всю мою карьеру, там за исключением каких-то фрилансерских вещей, да, у меня всегда была команда, у меня всегда был вот этот весь workflow, как обычно принято, с либо канбан, либо скрамом вместе с гитом. Я
05:36
Speaker A
работал. И мы работали в GitLab, там у нас тоже был свой CI/CD. Ой, не в GitLab, а в GitHub сначала. Это вот когда я работал, потом вот уже когда и по сей день у нас это GitLab, и там у нас
05:50
Speaker A
тоже также CI/CD, полностью обычный workflow: отдаём задачу на ревью, ревьюится, может правим. А тасктрекер какой-нибудь есть, там Jira какая-нибудь или что? Да, я работал и в Notion как трекер, потом это была, потом это вот сейчас последние годы это только -к
06:12
Speaker A
-трек — это не Яндекс случайно? Нет, это DbRainsовский продукт. Ээ, как раз, да, это хороший таск-трекер, достаточно мощный.
06:21
Speaker A
А какой-нибудь вот самый запоминающийся проект, самый тяжёлый, какая-нибудь задача там или вообще там половина архитектуры наспроектировали, сделали, ну, что-нибудь такое вот, чем гордитесь?
06:31
Speaker A
В плане проектирования архитектуры я не скажу, что это было сложно, но работа нет, не обязательно прямо там. Ну я знаю, что у нас просто работа она такая разная. Там можно на проде пойти, что-нибудь сломалось, там восстанавливали базу 2 дня. Просто вот, ну как бы самое
06:43
Speaker A
такое, что вот сделали. А мы работали над сервисом, который занимался как бы AI-переводом видео, э AI дабинг там был. То есть сервис предоставлял возможность отдавать видео, например, на английском, а на выходе получать полностью дублированное видео, например, на русский. Часто ютуберы сейчас этим
07:03
Speaker A
пользуются, чтобы не платить реальным актёрам. Вот делали я и дубляж. Вот. И сложная задача была, потому что в комплексе сложная задача, потому что это как-никак видео. А мы это решили делать на PHP. И вот, э, проблема в том, чтобы
07:20
Speaker A
обеспечить хорошее качество после транскрибации видео, после внедрения его дубляжа в это видео, чтобы видео было без артефактов и так далее, и так далее.
07:31
Speaker A
Я не скажу, что мы там просто, ну, что я принял там какое-то крутое решение архитектурное и так далее. Просто очень много времени понадобилось для того, чтобы видео было на хорошем уровне, без артефактов и прочего. Вот это то, на что
07:45
Speaker A
я много потратил время. Окей. Э, скажите, пожалуйста, локально как разрабатываете? Какое окружение используете для разработки?
07:52
Speaker A
Сейчас я работаю на Windows. Э, вся разработка у меня в контексте в WSL. Вот если как-то больше деталей ходить там по редактору, да, наверное, по редактору, по дебагу. Ну, редактор, я так предполагаю, у вас какой-нибудь PHPStorm, да? Ну, как PHPStorm у меня в последнее
08:09
Speaker A
время, ну, все годы, естественно, это был PHPStorm или WebStorm. А в последнее время у меня PHPStorm скорее существует для ревью кода, для там чуть более удобного какого-то запуска тесто
08:22
Speaker A
основном использую в основном работаю, реализую все задачи с помощью AI. Ар не не я использую сейчас, я с курсором тоже очень долго работал, но сейчас я использую код как агент вместе с дипсиком, потому что цена качества очень радует. Ну вот,
08:40
Speaker A
э, в плане, что, ну, ну, редак, да, работаю вс, у меня там, а, все проекты, они у меня работаю, подняты через докер, там, за исключением, может, каких-то фронтовых решений, но всё, что связано с ПХП, всё в доке.
08:52
Speaker A
Угу. О'кей. И Xбагом пользуетесь PHP? А, да, но, честно говоря, ээ не помню, наверное, года полтора, как [смех] не работал с ним, что-то как-то там проекты менялись и там на какие-то проекты вообще не адаптированы были под настройку XD Бага и было в падлу
09:08
Speaker A
настраивать, поэтому использовался условно Symphony Warumper какой-то, чтобы задампить данные всё. А так, да, работал, конечно.
09:15
Speaker A
Так, давайте к фреймворкам. Значит, по фреймворкам я понял, это по БКУ это был Lравеel в основном, да?
09:22
Speaker A
А Lara WordPress, да? Вот. Ну что там ещё? И получается по фронту тоже, если какие-то библиотеки есть, да? View в основном.
09:30
Speaker A
Ну, потому что вы с Ларой работали, я так понял. Да, честно говоря, нет. Это скорее совпадение, что Larovл экосистема подразумевает больше View плюс Lorell.
09:40
Speaker A
Просто он мне больше нравился. Ну, когда Угу. ещё со второй версии. Расскажите, пожалуйста, RF апи реализовывали сами, проболи, видели, знаете, что это такое?
09:50
Speaker A
Да. Хорошо. А-а, тогда такой вопрос уже такой ближе прямо а-а к прощупыванию ваших знаний знакомы. Что такое MVC паттерн?
10:00
Speaker A
А, ну MVC - это, по сути, архитектурный паттерн, который разделяет само приложение на таких три основных компонента model view controller. И если говорить вот по отдельности про каждый моду - это то, что чаще всего отвечает за state, за данные, а, за бизнес-логику
10:21
Speaker A
в том числе. Контроллер там отвечает за то, как мы обрабатываем какие-то пользовательские действия. Там, например, если человек дёргает какую-то API ручку, контроллер наш должен это резолвить или там нажимает кнопку, отправляется какой-то постзапрос, тоже это мы в рамках контроллера должны всё порешать. Ну и
10:41
Speaker A
view - это то, что мы уже непосредственно отдаём самому клиенту, пользователю. Там, например, отрендеренная страничка - это может считаться View. А отданный там JON у нашего API, это тоже считается вьюшкой.
10:54
Speaker A
Почему нет? Очень многое, в принципе, может считаться там представлением. Согласен с вами абсолютно. Хотелось вас спросить только про модель, но вы, по-моему, достаточно рассказали про всё.
11:03
Speaker A
Ну и, в общем, перед тем, как мы перейдём эк с вами к вопросам а про наш стек у меня к вам такой вопрос: как вы сами оцениваете свой уровень? У нас вот три градации есть, ээ, уже довольно гласные, да, джун, миidдл и сеньор. Вот,
11:18
Speaker A
вы себя как видите? Не знаю. Я, может, я скромничу, может, нет. Но вообще, мне кажется, я такой просто мидл достаточно крепкий в плане навыков профессиональных.
11:27
Speaker A
Угу. Сейчас модно, знаете, плюсики ставить. Аэ, у меня есть знакомый, у которого в Грейде написано Jниor+. Мы никак не можем понять, что это означает.
11:36
Speaker A
[смех] Вот поэтому, ну, midle плюс, да, получается. Ну, можно так сказать, да. Давайте, о'кей, сейчас всё проверим. Э-э, вы сами прямо почувствуете. Надеюсь, что вы не используете там никакие искусственные интеллекты, а пришли просто пообщаться, а, со своим коллегой, разработчиком по
11:52
Speaker A
PHP, получить удовольствие. А, погнали. А есть ли в PHP множественное наследование? Нет, в PHP нет множественного наследования.
11:59
Speaker A
А есть ли PHP версии 6? Нет, кстати, я вам забыл сказать, что на эти вопросы нужно начать быстро и не задумываясь, есть ли PHP версии 9?
12:07
Speaker A
Нет. Э, переменные функции передаются по ссылке или по значению? Означение. Можно ли создать объект абстрактного класса?
12:14
Speaker A
Нет. Какой модификатор доступа private public или protected делает доступным свойство только внутри самого класса, где оно объявлено?
12:21
Speaker A
Prvт. А какое место вызывается при создании объекта? Констракт. Любую отладочную функцию назовите, которой вы пользуетесь.
12:29
Speaker A
Warampмпе. Waramp. Угу. А и все четыре цикла PHP. For while for eachче. Ага. Коварный вопрос.
12:38
Speaker A
For while for each. Вот здесь на самом деле подвох. Дело в том, что цикл Wild он двойной, поэтому вы в принципе всё правильно сказали, но как бы есть циклы с посусловием, есть с предусловием. Вот есть while, а есть какой ещё? Ну,
12:56
Speaker A
который сначала делает, а потом проверяет. А do while. Ну да, да, всё о'кей. Ну похоже, да, скрининг быстро. Вот поэтому давайте переходим к основной части. Чувствую, сегодня мне будет интересно. Так, я сейчас расшариваю экран, а вы мне говорите, всё ли вы видите на нём. Я
13:11
Speaker A
прибавил специально для вас до трид э-э шрифт. Ну и вот, наверное, надо было легатуру ещё отключить. Видите код?
13:18
Speaker A
Нет, пока я не вижу экрана вообще. А, секунду, секунду, сейчас. О, сейчас должно быть лучше.
13:24
Speaker A
Угу. Есть. Тогда поехали. А что выведится на экран? На экран выведится фолs Почему? Потому что единица строка не равно единице integer, когда мы делаем строгое сравнение.
13:37
Speaker A
Похоже, типы разные, да? Да. А есть такая конструкция, как называется и как её использовать.
13:44
Speaker A
А в целом вот это вот про про трейд тут вопрос наверное да да, да, да, абсолютно верно.
13:50
Speaker A
А ну трейд как раз-таки частично предназначен для того, чтобы решать проблему отсутствия множественного наследования. Её можно использовать, в принципе, в любом классе, используя оператор use, прямо внутри тела класса.
14:02
Speaker A
И внутри класса будет доступен и это свойство name. И также там будет доступно и этот и этот метод. Пас.
14:09
Speaker A
У меня такое ощущение, что вы прямо читаете где-то. [смех] Я читал свой курс уникальным.
14:16
Speaker A
Вы так спокойно. Такое ощущение, что у вас второй монитор, короче, прошло куда-то там, и вы прямо читаете. Поэтому так. Давайте следующий вопрос по PHP.
14:25
Speaker A
Вот такая конструкция в коде. А нужно рассказать что будет напечатано на экран. То есть, если я вот скопирую сейчас песочницу, что в какой последовательности выводит, выведется, какие надписи.
14:36
Speaker A
Здесь, скорее всего, выведется ошибка и следом выведется finли, поэтому, ну, ошибка с текстом непосредственно, потом выведется finли блок.
14:47
Speaker A
Угу. Угу. О'кей. Так, а здесь сейчас будет сложновато. Вам нужно понять, а мою мысль, которую я придумал. А я создал два объекта: объект А и B. Объект B очень простой. У него просто вызывается функция print hello.
15:01
Speaker A
Вот. А, но объект А содержит функцию get object B, которая, по моей задумке, э, должна была откуда-то взяться. Ну, предположим, там, аэ, сходил в базу по айдишнику, попробовал получить, ничего не прилетело, вернул нул. В клиентском коде, э, я создаю объект типа А, пробую
15:19
Speaker A
вызвать, ну, получить объект типа Б, и у него пробую получить, а, ну, как бы у него, у этого объекта Б пробую вызвать функцию print Hello. Этот код работать не будет. У меня к вам вопрос. Почему?
15:30
Speaker A
Какая будет ошибка? Понятно. Здесь типа ожидалось, что Get Object B вернёт ну какую-то сущность, но вернуть он её не смог. Вернул нул. Да, абсолютно верно.
15:41
Speaker A
Не сработает, потому что мы мы в данном случае вернули нул. Мы же не вызвали, не вернули здесь объект того же Б, поэтому и Ну, о'кей. Ошибка, знаете, какая будет?
15:51
Speaker A
Это хороший вопрос. Я не знаю, там может быть какой-нибудь, не знаю, ну, ну, что-то типа не найден метод. Не знаю, там не смог вызвать какой-то метод print Hello на нуле, допустим.
16:01
Speaker A
А как вот это всё исправить вот в клиентском коде? Сейснул, можно вопросик долбануть перед стрелкой вот сюда. Да, ну сейф, да. Да, тогда ошибки не будет.
16:12
Speaker A
Согласен. А так очень хочется поспрашивать у вас поралю. Вы в нём, да, я так понял, некоторое время провели.
16:20
Speaker A
Давайте да по мне попадаются ворпресеры в основном. И прямо совсем мне А есть такой контроллер, вопрос, как он называется?
16:27
Speaker A
Делается ресурсный контроле командой. Ну, скучно с вами, прямо невозможно. Так, вот это вот знаете что?
16:36
Speaker A
А, ну список роутов, да, объявлен. А в каком файле находится? Ну, вероятно, в веб либо в Апе. Ну, roads, web или app, PHP.
16:44
Speaker A
Угу, угу, угу. Так, а вот эта команда что делает? Откатывает последние выполненные миграции. Угу. А вот давайте как раз про самим миграции. Они вообще ээ как бы для чего они нужны?
16:58
Speaker A
Давайте простым языком. Это просто описанные таблицы, которые нам нужны в базе данных. Вот здесь вот в app-таки мы описываем через фасад схемы, какая нам нужна таблица. Через Blueprint Builder мы описываем, какие должны быть колонки.
17:15
Speaker A
Да, он нужен для того, чтобы вот как раз-таки при рулбеке выполнить обратное действие. В данном случае откатить добавленную таблицу.
17:24
Speaker A
Угу. О'кей. Так, э в модели банк у меня есть вот такой метод. А это что это такое? Одно и для чего надо?
17:33
Speaker A
Одно ко многому. Э-э, это нужно для того, в данном случае банк э-э будет искать все сущности модели кредит, э, у которой банк ID соответствует айдишнику текущей модели.
17:49
Speaker A
Ну, то есть найдёт все кредиты, да? Все кредиты, да, которые по вторичному ключу связаны с банком. Так, вопрос по композеру вкратце, что делают вот эти две команды require. Ну, вот компози устанавливает пакет, который мы здесь укажем. Install устанавливает все пакеты, которые
18:06
Speaker A
объявлены в компор jon, либо те, что если есть компор LCK, установят все из компор LК.
18:12
Speaker A
Угу. Угу. Так, по Варпрессу казали, что у вас есть, да, тоже какой-то опыт. Давайте попробуем. Что?
18:21
Speaker A
Угу. Ну, в данном вообще в Вордпрессе концепция есть есть концепция фильтров и экшенов. И в данном случае фильтры, вообще в Wordпрессе фильтры нужны для того, чтобы фильтровать и, возможно, как-то модифицировать какое-то значение э-э вот этого хука The Title. Короче,
18:40
Speaker A
что произойдёт здесь? Здесь произойдёт то, что у всех сущностей, у которых есть The title, которые используют этот хук, этйт станет большими буковками.
18:52
Speaker A
Угу. А почему вот в фильтрах нужно именно возвращать return писать? Что будет, если я, ну, не напишу RNS?
18:58
Speaker A
Ну, потому что сами по себе концептуально фильтры требуют, чтобы возвращалось какое-то значение, потому что они как раз как бы для этого и предназначены. То есть как по-хорошему это типа маппер, наверное, он отдаёт тебе о вызывает этот хук, отдаёт тебе в
19:11
Speaker A
этом хуке какие-то данные, и ты дальше должен либо вернуть данные в том же виде, либо, если тебе надо что-то с ними сделать, поправить. Но тебе в любом случае для этого нужно их вернуть, чтобы он дальше их пере использовал, так как
19:21
Speaker A
это кола был. У. Угу. Так, о'кей. по запросу теперь, значит, что делает код? Первый вопрос.
19:29
Speaker A
Ну, здесь у нас формируется, по сути, запрос в базу данных, где мы делаем выборку всех постов, у которых там тип продукт и которые лежат в данном случае на десятой странице. Потом, собственно, по этому списку выбранных постов мы проходимся с помощью while на каждой
19:48
Speaker A
итерации мы, по сути, получаем наш объект с постом. И вот дальше тут выводим через глобальную функцию его его заголовок получим.
19:59
Speaker A
Угу. А, наверное. Аа скажите, пожалуйста, нужно ли ээ вызывать после такого запроса VP, reset постataта? А-а, ну я я честно скажу, что я сам не не пользовался этой функцией, но да и воще вообще в целом этой всей конструкции, но
20:15
Speaker A
могу просто предположить, что, учитывая то, что в Вордпрессе очень много многое держится на глобальном контексте и и возможно там где-то глобально у нас хранится объект самого поста, да, нужно типа всю эту историю подчищать, но тут я на 100% не уверен, честно говоря, просто
20:33
Speaker A
не знаю. Это моя гипотеза просто. А, наверное, у вас, а-а, я так понимаю, что здесь глобальный объект перезаписывается и отдельный запрос. И если вы не сделаете, а, как бы постта, то получится, что глобальный объект запишет как раз результаты этого запроса. И
20:52
Speaker A
получается данной странички самой с которой былделан запрос, они пойдут по одному месту. По этой же причине вот глобально использовать нельзя, а лучше отдельно делать. А, о'кей. А-а, значит, вот, э, такой код есть. А что он делает?
21:08
Speaker A
Ну, он просто добавляет новый тип поста, а регистрирует books. Ну, у него будет как бы айдишник буook, а сам по себе вот он будет публичный.
21:21
Speaker A
Угу. А не подскажете, почему вот в Инити надо делать это? Ну, почему прямо в Инити, я не знаю, но, ну, это вообще в целом, э-э, ну, у нас происходит инициализация WordPress приложения и, э, как вот все плагины и всё остальное, они
21:37
Speaker A
должны вот в момент инициализации, на какие инициализации, добавить всё, что им нужно. Вот в данном случае добавить новый пост как тип. Угу.
21:45
Speaker A
Просто это вот вот так сделано. О'кей. О'кей, согласен. Так, попрессу всё, наверное. А-а, да, и вообще всё, наверное, с PHP. А, у нас есть с вами секция SQL. Вот. И сейчас тоже я постараюсь вам по максимуму помочь здесь. Э, значит, есть две
22:04
Speaker A
таблички: parent и child. Они очень простые: айдишник и name, но в таблице child ребёнок, да, есть ссылка на родителя parent ID. Вот так прописана связь. Я беру и наполняю эти таблицы данными. Значит, а в таблицу parent я вставляю одну строчку. В таблицу Child я
22:21
Speaker A
тоже вставляю одну строчку. Указываю parent ID равно единичка. А таблички получаются вот такие вот. Ну, то есть айдишник в паренте и как бы айдишник, ссылка на родителя в чайлде. Вот. Далее я пытаюсь удалить запись из таблицы parent, из вот
22:40
Speaker A
этой первой. А мне бдшка выдаёт ошибку вот такую вот. Can delete update forign constraint reference. А вопрос, что это за ошибка и как мне всё-таки удалить запись из parent? Ну, так происходит, потому что вторичный ключ ээ был определён таким образом. Не
22:57
Speaker A
использовался какой-то cascate on delete, а здесь просто on delete restrict. Поэтому, собственно, это по сути защита целостности данных. Он не даёт удалить parent, потому что у него есть дети. Чтобы удалить parрент, нужно сначала удалить детей, потом уже можно
23:13
Speaker A
удалить будет парент. Согласен абсолютно с вами. А самый правильный и чёткий способ, но есть и трышовые. Может быть, про них что-нибудь придумаете.
23:22
Speaker A
Э-э, ну, отключить проверку for вторичных ключей в базе. Угу. А как отключить? Ээ, я не помню, как это дословно делается, какой SQL запрос, но есть он.
23:35
Speaker A
Он отключает проверку вторичных ключей. Мы можем делать всё, что угодно, а потом включить. Ага. И третий способ, какой? Самый самый трышовый из всех.
23:44
Speaker A
Drop table. Не знаю. Нет. Drcate for. На самом деле, если нам мешает связь, мы можем просто удалить.
23:50
Speaker A
А, точно, точно, мы можем удалить связь, да? То есть данные-то останутся, а связь просто удаляем и всё. А так вы, конечно, всё правильно сказали. Вот. А так, переходим к следующему запросику. Два одинаковых запроса вот различаются только одним словом. Здесь inner, здесь
24:04
Speaker A
left. А значит, из таблицы customers джойним таблицу orders. Ну, customers - это соответственно покупатели orders - это заказы их. Вот. -э два абсолютно одинаковых отличаются только вот этим словом. Вот вопрос: в каком э-э запросе будет выдача больше строк?
24:22
Speaker A
Так ну тут первый запрос получается иннерам вернёт только тех клиентов, у которых есть ээ соответствующие заказы, а второй у нас, получается, вернёт всех клиентов, даже если у них заказов нет.
24:43
Speaker A
Там простор ID по сути будет нулом и всё. И если у нас с вами получается есть ээ кастомеры, которые не сделали ни одного заказа, да, получается в любом случае у нас в левой таблице будет больше.
24:55
Speaker A
Угу. Да. Всё. Так. Так. Вот сейчас сложный пример. Э нужно рассказать, что делать вот этот запрос.
25:01
Speaker A
Сейчас я вам расскажу, как табличка устроена. Она состоит из трёх полей: ID, client ID и сум. Ну, client ID - это ссылка на там таблицу клиентов, предположим. ID - это айдишники. А как бы сумма заказа она, э, ну, как бы
25:16
Speaker A
третий параметр. Вот приходит аналитик ко мне и говорит: "Слушай, слышно, нужно узнать такие-то данные, такой-то отчёт".
25:22
Speaker A
Я вот пишу такой запрос. Вот вопрос: на какой вопрос отвечает этот запрос? Что он делает?
25:30
Speaker A
А, ну, Group by Client ID у нас по сути объединяет все заказы по клиентам. Count ID у нас считает количество заказов каждого клиента.
25:43
Speaker A
Н в данном случае у нас по сути фильтрует записи по количеству заказов. Так, ну касаемо вопроса wiн на нет, заменить на здесь не получится, потому что фильтрует записи до группировки анг-таки помогает решить проблему фильтрации там после непосредственной группировки. Ну а
26:12
Speaker A
по своей сути этот запрос по сути считает количество заказов у каждого клиента и выводит только тех клиентов, у которых есть хотя бы один заказ.
26:24
Speaker A
Ну если бы хотя бы один я бы, наверное, равно тут поставил, тогда бы один бы был бы. А это, наверное, больше одного. А дадада здесь два сюда попадёт, один не попадёт. Да, да, да. Здесь будут все клиенты, у
26:37
Speaker A
которых есть два и более заказа. Вот так вот. Угу. Угу. И будет показываться количество заказов, правильно?
26:44
Speaker A
Да. Так, теперь ещё остались общие вопросики по технологиям. Вот. Хорошо, что вы прямо докер упомянули. Хорошо, что вы его используете. Я считаю, докер - это такой, ну, признак проснализма, да. Must have - это как бы когда слышу open
26:59
Speaker A
сервер, расстраиваюсь, а когда слышу докер, сердце радуется. [смех] Вот. А расскажите вот что команды делают.
27:06
Speaker A
Docker POL здесь потянет вот этот образ, который мы здесь указываем, э, локально с Токерхаба, и он будет лежать, его можно будет использовать. А вторая команда запускает ээ контейнер и выполняет в нём команду. Здесь получается минус-минус RM удаляет контейнер после
27:28
Speaker A
завершения, а минус IT запускает его в интерактивном как раз режиме. А вот этот вот минус V- это мы маунтим по сути текущую папку на папку app в контейнере.
27:44
Speaker A
Ну и в итоге, собственно, как бы задача в том, чтобы через контейнер были установлены композер зависимости.
27:51
Speaker A
Правда, что-то я не до конца понял, почему тут просто installл, так как должно быть.
27:58
Speaker A
Ну, если мы хотим установить компор зависимости, то композерл. То есть вот так, да? Супер. Вопросов к вам здесь нету.
28:07
Speaker A
Прогит наверняка там пуште идшку. Если вспомните команду, будет здорово. Да, это на самом деле. Я всегда боюсь этих вопросов, потому что я реально давно очень не использовал. А ну вы не переживайте, вы все так делают, но как бы это уже пошёл.
28:26
Speaker A
Ну здесь в целом нет сложных команд. Гитстатус просто показывает текущее состояние твоей текущей ветки. Если есть незакомиченные или модифицированные файлы или недобавленные файлы, он это скажет. Git push Origin. Ну вот это это означает, что мы просто запушим текущие
28:45
Speaker A
локально сделанные комиты в на удалённую ветку. Касаемо Gitдиv, он покажет просто различие текущей ветки, на которой мы находимся. Относительно вот эту, которую мы здесь указали. Покажди. Не так то, что прямо плохо. Вы не знаете, я вам хочу сказать,
29:02
Speaker A
не если бы здесь был какой-нибудь типа гит eBay Soft, что-то такое вот я бы здесь мог поплыть, потому что поплыл бы, да, это всё через UI, там git с Тогда тогда, раз уж вы сами сказали, любое слово, сказанное вами на
29:17
Speaker A
собеседование, будет обязательно против вас. Я вам сейчас задам классический вопрос: чем отличается Мёрж от Ребейза?
29:23
Speaker A
А, ну, по сути, разница у мержа и Ребейза в том, как они влияют на историю ветки. То есть, если мы говорим про Мёрш, он объединяет две ветки так, что у них сохраняются сохраняется их история. Там обычно это сопровождается каким-то специальным
29:41
Speaker A
мёркомитом. А вот он работает концептуально по-другому. Он берёт ветку на от которой мы на которую от которой мы ребейзимся и на неё уже складывает те комиты, которые мы накомитили в нашу ветут. То есть, по сути, мы взяли актуальную ветку main, там мастер и
30:00
Speaker A
наложили сверху наши комиты. Тем самым у нас получается чистая история. Правда, вот у тех комитов, которые были у нас до этого, а меняются хыши, но в целом это не принципиальный момент. Я вообще считаю, что если ты хочешь обновить свою
30:13
Speaker A
фичеветку от мастера, то лучше всегда использовать Bйс, потому что, ну, на мой вкус, здесь мер вообще никак не подходит. Ну да, странно. А я вот наоборот никогда в жизни не ребейзил и не собираюсь, только мёрж. Не, мне кажется, это ошибка.
30:31
Speaker A
Мы с вами из разных социальных слоёв, из разных лагерей. Я исключительной. Исключительно. Понятно. Ну, на самом деле, тут от команды ещё зависит, куда попадёте. Если там не любить то как бы А так по HTМУ вопрос тоже есть. Нужно найти ошибку как
30:46
Speaker A
минимум одну. Тег нет закрытого 1х2 H2 нет закрывающегося тега. Если вот так поставлю закрывающийся тег, э будет ещё какая-то ошибка. Просто интересно.
30:58
Speaker A
Посмотрим. Ну тоже не то, чтобы ошибка, вам тут шторм подсказывает не по-детски. Ну что-то он подсказывает. Только я не понимаю, что он что он подсказывает. Ну, блочный элемент в блочном элементе, что ему не нравится.
31:10
Speaker A
А вот, оказывается, нельзя писать внутри H2 какие-либо элементы. Да, знаете, и ещё есть ошибка, ребята, особенно которые в FRНENД очень хорошо убираю упираются, они здесь говорят про тег Leng ещё нету тега вот такого. Ну, помню там да ру.
31:26
Speaker A
Ну, это да, это это всё на уровне этих, так как и в изображениях. Хальт тоже обязательный, типа, чтобы семантика соблюдалась, всё было там по красоте для роботов и так далее. И, честно говоря, в реальной практике мы реально забиваем.
31:39
Speaker A
Мы можем div в батн запихать, лишь бы сделать, чтобы это работало. Например, когда нужен какой-то фокус, а нормально JS мы заиспользовать не можем. Но для меня, если честно, открытием было, что вроде как оба блочные элемента, и почему-то в H теге нельзя запихивать
31:54
Speaker A
другие блочные элементы. Ну либо параграфы. Ну да, видимо, потому что хедер, да. Вот. А так, слушайте, а ситуация с вами сложилась интересная. У меня все вопросы кончились на midleп. Вы точно наговорили уже. У меня больше большое желание с
32:09
Speaker A
вами пообщаться по поводу высоких материй, а по поводу солида. Может быть, вы мне попробуете сказать, какой принцип solт нарушается в классе, который я написал.
32:22
Speaker A
Ну давайте, если помните вообще, какие они есть. Честно говоря, я плохо помню всю эту расшифровку.
32:27
Speaker A
Ну давайте так. Если не помните прямо название, а тогда можете попробовать своими словами объяснить, что здесь не так. А, возможно, ваши рассуждения совпадут с принципом. У меня такие случаи были в моей практике. Ээ, я прямо верю, что вам нужно попробовать. Да не,
32:42
Speaker A
ну на самом деле здесь, ээ, ну, наверное, тут идёт всё в сторону того, что класс у нас тут отвечает непосредственно за хранение данных и форматирование данных. Обычно это всё декомпозируют, разбивают. Наверное, типа в этом вся речь. Вообще, ну, близко, да, согласен. Ну, как бы
32:59
Speaker A
один класс должен быть вот как раз-таки для хранения там, а другой класс там какой-то класссервис, например, для, ну, в данном случае форматирование или какой-то другой бизнес-логики.
33:08
Speaker A
То есть, в принципе, э что получается здесь не так давайте попробуем подытожить одним предложением. Вот есть класс документ, у него есть свойства, э, какие-то там есть сетеры геттеры потом и в конце вот это документ - это модель просто моделька. а-а эту модельку уже в
33:25
Speaker A
дальнейшем должны использовать для того, чтобы делать какой-то принт. Ну, по логике вот так. Ну, то есть как исправить? Давайте так.
33:31
Speaker A
Как исправить? Убрать print, вы, ну, создать, не знаю, document севиice, ээ, и там зафайндить какой-то документ и в методе print взять его гетры и отрисовать так, как нужно. А я вам сейчас расскажу всё, что я здесь затеял. Ну, просто для того, чтобы, э,
33:50
Speaker A
вы не мучились, э, потому что если человек как бы, ну, особо прямо не вглублялся в эти принципы, важно, а что он их просто чувствует, и у вас это уже есть. Поэтому давайте сейчас второй метод посмотрим. Тут чуть посложнее код.
34:04
Speaker A
Здесь есть свойства имя, да, есть класс животное, есть имя и есть метод, который подсчитывает количество ног у животного.
34:13
Speaker A
Вот. Вот что здесь плохо? Ну, здесь, в принципе, плохо, что мы конкретизируем в абстрактном методе animal. Он, по-хорошему, должен быть либо абстрактным, либо просто отдельным. А мы по-хорошему здесь должны были создавать метод дак, метод docг, ой, не метод,
34:30
Speaker A
извиняюсь, классы, и уже их наследовать от Animal. по-хорошему сделать get quality абстрактным э методом и уже в методах, которые классы, которые бы наследовали animal имплементировать метод так, как нужно. Для класса DAC возвращать два, для класса Dogчетыре.
34:53
Speaker A
Ну вы в курсе, что вы озвучили один из методов как раз Солида? Конечно, вот я бы на вашем месте Solid бы перед тем, как идти на Сабес по PHP, выучил бы как контчи наш. Я в своё время тоже много
35:04
Speaker A
ходил побесам и решил, что я это выучу просто всё. Вот, знаете, как правило, дож движение перед экзаменом, эти билеты, э- их надо просто выучить, вот и даже не думать. И как бы у вас ситуация интересная, я сейчас вам расскажу всё,
35:19
Speaker A
что я тут задумал и что здесь нарушается и не нарушается. И в общем, получается, что вы как бы знаете, просто нужно немножечко оформить это.
35:27
Speaker A
Я это не теоретик. [смех] Ну, тем не менее сабес штука такая. Да. Значит, здесь нарушается принцип открытости, закрытости, да? Это open close. Принцип второй, по сути, а действительно метод getx quantity анализирует конкретные свойства объекта. Это вы тоже сказали с ходу. Вот. И, конечно,
35:52
Speaker A
решением, как это убрать, ээ, является вот, ээ, то, что вы как раз описали, э создать абстрактный класс Animal, заставить, ну, либо интерфейс там, либо абстрактный метод getlity и пусть конкретные ээ ребята ээ, их наследуют. Смысл в том, что если
36:10
Speaker A
я здесь, например, захочу добавить ещё какое-то животное, да, а мне потребуется этот метод переписать. А принцип открытости, закрытости как раз гласит о том, что классы должны быть открыты для расширения, но закрыты для модификации.
36:23
Speaker A
То есть, если появляется змея, грубо говоря, мне нужно ноль сделать, да, у неё ног нету, то я должен буду брать этот класс, вот этот if ещё допиливать там, да, свич сюда втыкать. Вот это вот плохо. Э та архитектура, которую вы
36:37
Speaker A
предложили, она этот вопрос решает. Мы будем создавать класс Snake змея, да? А классы дак и дог у нас останутся нетронутыми.
36:48
Speaker A
Вот вот это вот как бы такой простенький принцип, но тем не менее а такой один из самых ээ такой встречаемых, на мой взгляд, потому что не сразу его видишь везде. И вы сходу рассказали, как должно быть. А значит, в первом случае ээ всё
37:04
Speaker A
правильно. Класс докумен отвечает за структуру документа, за title body ифтер, какие-то операции с ними. Вот. И это единственная причина для его изменения. То есть, если у меня добавится там какая-нибудь дата ещё, я впишу сюда, да, или там ещё какой-то там
37:20
Speaker A
колонка какая-то правая добавится, я добавлю. Вот это причина для изменения класса документ. Вот. А то, что мне нужно вывести на экраново, а это плохо, что я пишу здесь, потому что я действительно должен создать отдельную сущность, какой-нибудь там принтер, да,
37:35
Speaker A
или сервис, и ему там, например, в конструкторе передать этот документ, и пусть он с ним делает, что хочет. Таким образом, я разделяю ответственность. А документ у меня отвечает за структуру, принтер у меня отвечает за способы вывода. Вот, э, это первый принцип
37:50
Speaker A
solidт, принцип единственной ответственности, тоже такой самый лёгкий. Вот. И, в общем, вы его тоже с ходу рассказали. Я вас поздравляю. Э, мне кажется, вы плюс плюс [смех] как раз тот самый.
Topics:PHPсобеседованиеWordPressLaravelразработкаAIменторствоWebtalkDockerCI/CD

Get More with the SozAI App

Transcribe recordings, audio files, and YouTube videos — with AI summaries, speaker detection, and unlimited transcriptions.

Or transcribe another YouTube video here →