ru
Feedback
Библиотека собеса по PHP | вопросы с собеседований

Библиотека собеса по PHP | вопросы с собеседований

Открыть в Telegram

Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/5JWKxA Для обратной связи: @proglibrary_feeedback_bot

Больше
3 114
Подписчики
-324 часа
-67 дней
-1930 день
Архив постов
В чём разница между связанностью (coupling) и сцепленностью (cohesion)? Cohesion (сцепленность)насколько элементы внутри одного модуля подчинены общей цели. Высокая сцепленность — это хорошо: модуль делает одну вещь и делает её хорошо. Coupling (связанность)насколько модули зависят друг от друга. Низкая связанность — это хорошо: изменение в одном модуле не вынуждает переписывать другие. Цель проектирования — high cohesion, low coupling. Такой код легче читать, тестировать, переиспользовать, а изменения в нём локализованы. Инструменты достижения — разделение ответственности, программирование на интерфейсах, внедрение зависимостей и принципы SOLID.

🚀 Освойте разработку AI-агентов и получите доступ ещё к двум курсам Академии бесплатно! В 2026 году просто писать код мало.
🚀 Освойте разработку AI-агентов и получите доступ ещё к двум курсам Академии бесплатно! В 2026 году просто писать код мало. Компании ищут инженеров, умеющих проектировать автономные системы и закрывать задачи бизнеса в разы быстрее. Чтобы вы вышли на рынок с максимальным преимуществом, мы подготовили специальное предложение: покупаете курс по AI-агентам и ещё 2 курса Академии получаете бесплатно! Соберите свой стек под оффер: 🔹 AI-агенты + AgentOps + Архитектура — комбо для бэкендеров и техлидов, чтобы внедрять ИИ без боли для прода. 🔹 AI-агенты + Математика + ML — для тех, кто хочет войти в Data Science. 🔹 AI-агенты + Алгоритмы — чтобы уверенно проходить хардкорные технические собесы. Как это работает: вы оставляете заявку на курс по разработке AI-агентов и указываете еще два курса, которые хотите открыть в подарок. Старт обучения — уже в июле. Количество мест ограничено, выбирайте зрелый подход к карьере. 👉 Забрать предложение и освоить ИИ-агентов

Что такое нормализация и когда оправдана денормализация? Нормализация — устранение избыточности через декомпозицию таблиц и связи между ними (нормальные формы 1NF–3NF/BCNF). Цель — целостность: данные хранятся в одном месте, нет аномалий вставки, обновления и удаления. Минус — много JOIN'ов при чтении. Денормализация — намеренное дублирование данных ради скорости чтения, чтобы избежать дорогих соединений и агрегаций. Типична в аналитике, отчётах и read-heavy системах. Это компромисс: денормализация ускоряет чтение, но усложняет поддержание согласованности при записи (одни и те же данные надо обновлять в нескольких местах). Выбор зависит от профиля нагрузки — что преобладает, чтение или запись.

Чем INNER JOIN отличается от LEFT JOIN? INNER JOIN возвращает только те строки, для которых нашлось совпадение в обеих таблицах. Если связи нет — строка не попадёт в результат. LEFT JOIN возвращает все строки из левой таблицы плюс совпадающие из правой. Там, где совпадения нет, в столбцах правой таблицы будут NULL. RIGHT JOIN — то же самое, но «главная» правая таблица.

⏰ Уже сегодня в 19:00 (МСК) стартует наш открытый урок! Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдых
Уже сегодня в 19:00 (МСК) стартует наш открытый урок! Знаем, летом хочется отложить учёбу на осень. Но пока остальные отдыхают 😅, мы предлагаем без лишней конкуренции прокачать свой workflow и начать закрывать тикеты в три раза быстрее. Тема:
«AI-инструменты в разработке: пишем код быстрее»
Мы покажем живой разбор реального проекта: как с помощью AI-ассистентов мгновенно разбираться в чужой кодовой базе, искать нужные участки и собирать Pull Request. Только рабочие промпты, которые сэкономят вам часы рутины. 🎙️ Спикер — Ольга Лукьянова, руководитель команды в SourceCraft (18+ лет развивала инструменты в JetBrains и Huawei). 👉 Узнать, как ускорить разработку с AI

Чем WHERE отличается от HAVING? Оба фильтруют, но на разных этапах выполнения запроса. → WHERE отсекает строки до группировки (GROUP BY) и не может работать с агрегатными функциями. → HAVING отсекает уже сгруппированные данные после агрегации и умеет работать с агрегатами (COUNT, SUM, AVG). Логический порядок выполнения: WHERE → GROUP BY → HAVING → SELECT → ORDER BY.

Какие бывают уровни изоляции транзакций? От слабого к строгому: 🔹 READ UNCOMMITTEDвидны незакоммиченные изменения других транзакций (грязное чтение). 🔹 READ COMMITTEDвидны только закоммиченные данные, но при повторном чтении строки значение может измениться (неповторяющееся чтение). 🔹 REPEATABLE READодна и та же строка читается стабильно в рамках транзакции, но возможны фантомы (новые строки, подходящие под условие). 🔹 SERIALIZABLEполная изоляция, транзакции выполняются как будто строго последовательно. Чем выше уровень, тем меньше аномалий, но больше блокировок и ниже пропускная способность. Выбор — это компромисс между корректностью и производительностью.

🤖 Какие задачи можно действительно доверить ИИ? Уже завтра разберём это на открытом уроке «AI-инструменты в разработке: как писать код быстрее с помощью ассистентов». Спикер — Ольга Лукьянова, руководитель команды поиска и навигации по коду в SourceCraft от Яндекса. После урока вы: 🔹 поймёте, какие задачи стоит делегировать AI уже сегодня; 🔹 научитесь быстрее разбираться в новых проектах и кодовой базе; 🔹 увидите, как выглядит современный workflow разработки с AI; 🔹 узнаете, где AI помогает экономить время, а где всё ещё нужен контроль разработчика. На практике разберём путь от получения задачи до готового Pull Request с использованием AI-инструментов и AI-ревью. 🗓️ 23 июня, 19:00 (МСК) ⏱️ 90 минут 👉 Зарегистрироваться и получить рабочий AI-workflow для своих задач

✔️ PHP-тест: лента, в которой посты двоятся и пропадают Пользователь листает ленту и видит один и тот же пост дважды. А кто-то жалуется, что пропускает записи 👇 📦 Задание Соцсеть, активная лента, новые посты прилетают каждую секунду. Постраничный вывод сделали классически, через LIMIT/OFFSET. На ревью прошло, тесты зелёные (в тестах данные статичные). В проде в часы пик начались жалобы: дубли на стыке страниц и «куда-то делся пост, я его точно видел».
// src/Feed/FeedRepository.php
class FeedRepository
{
    public function __construct(private readonly PDO $pdo) {}

    public function page(int $page, int $perPage): array
    {
        $offset = ($page - 1) * $perPage;

        $stmt = $this->pdo->prepare(
            'SELECT id, author_id, body, created_at
               FROM posts
              ORDER BY created_at DESC
              LIMIT :limit OFFSET :offset'
        );

        $stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();

        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}
🔹 Задачи — Объяснить, почему на меняющихся данных OFFSET даёт дубли и пропуски между страницами — Объяснить, почему сортировка только по created_at дополнительно усугубляет проблему — Переписать на keyset-пагинацию (cursor) так, чтобы вставки/удаления не сдвигали выдачу Ставьте → 🔥 если нравится формат. Если нет → 🌚 💬 Решения пишите в комменты под спойлер, сравним подходы.

🤖 AI пишет код за вас? Это самое скучное, что он умеет Основное время разработчик тратит на другое: разобраться в чужой кодо
🤖 AI пишет код за вас? Это самое скучное, что он умеет Основное время разработчик тратит на другое: разобраться в чужой кодовой базе, найти нужный участок проекта, проверить решение, собрать Pull Request. Вот где AI реально экономит часы — если знать, как им пользоваться. 23 июня Ольга Лукьянова покажет это на практике: как с помощью современных AI-инструментов быстро погружаться в незнакомый проект, находить нужный код, реализовывать задачи и проверять результат до ревью коллег. В итоге вы увидите не отдельные приёмы и промпты, а целостный workflow, который можно встроить в свою работу уже на следующий день 🔥 Чтобы лучше погрузиться в тему: 📺 Выступление про SourceCraft 📖 Статья на Хабре 🗓️ Когда: 23 июня, 19:00 (МСК) 👉 Занять место на открытом уроке

Что такое генераторы и оператор yield? Генератор — функция с yield внутри; она возвращает объект Generator и вычисляет значения лениво, по одному, не держа весь набор в памяти. Это позволяет итерировать огромные или бесконечные последовательности почти без расхода памяти (например, построчное чтение большого файла). yield может не только отдавать, но и принимать значение через send(), а yield from делегирует другому итератору.

Что такое трейты и как решаются конфликты имён? Трейты — механизм горизонтального переиспользования кода, обходящий ограничение единичного наследования. Набор методов и свойств подмешивается в класс через use. Если два трейта дают метод с одинаковым именем, будет фатальная ошибка. Решается через insteadof (явно выбрать, чей метод оставить) и as (создать алиас второму).

Разница между == и === ? == сравнивает значения с приведением типов (loose), === сравнивает значение и тип (strict). В PHP 8 нестрогое сравнение стало адекватнее: "abc" == 0 теперь false (раньше было true). Для объектов: == равны, если тот же класс и равные свойства; === только если это одна и та же ссылка на объект.

⏰ Уже сегодня в 19:00 (МСК) стартует открытый урок! Тема:
«Мультиагентные системы: почему большинство архитектур переусложнены»
🔥 За 90 минут разберёмся, когда действительно стоит строить мультиагентную систему, а когда она только добавляет сложность, расходы и новые точки отказа. Поговорим о критериях выбора архитектуры, типичных ошибках и ограничениях современных ИИ-агентов, которые важно учитывать ещё до внедрения в продукт. 🎙️ Спикер — Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru. 🎁 Для всех участников подготовили промокод на скидку 10 000 ₽ на курс «Разработка ИИ-агентов». 👉 Успей присоединиться к уроку

Зачем нужны магические методы __get / __set / __call? __get и __set срабатывают при обращении к недоступному или несуществующему свойству, __call — при вызове недоступного метода экземпляра, __callStatic — статического. Они дают «перехват» обращений и применяются в прокси, ORM, фасадах. Минусы: они медленнее прямого доступа, скрывают реальный API от IDE и статического анализа, поэтому злоупотреблять не стоит.

🔥 Чем больше агентов — тем лучше? Не всегда. Уже завтра поговорим о реальных ограничениях на открытом уроке «Мультиагентные
🔥 Чем больше агентов — тем лучше? Не всегда. Уже завтра поговорим о реальных ограничениях на открытом уроке «Мультиагентные системы: почему большинство архитектур переусложнены». Спикер — Дмитрий Юдин, руководитель AI/ML-направления в Сloud․ru. После урока вы: 🔹 будете лучше ориентироваться в выборе между одним агентом и мультиагентной системой; 🔹 поймёте, какие архитектурные ошибки встречаются чаще всего; 🔹 получите практические ориентиры для проектирования и внедрения агентных систем; 🔹 будете лучше понимать возможности и ограничения современных ИИ-агентов. 🗓️ 18 июня, 19:00 (МСК) ⏱️ 90 минут 👉 Зарегистрироваться и получить промокод на 10 000 ₽

Объекты передаются в функцию по ссылке или по значению? Объекты передаются по «хэндлу» (идентификатору), а не копируются: менять состояние объекта внутри функции можно без &. Массивы и скаляры передаются по значению, но копируются лениво — copy-on-write: реальная копия создаётся только при первой записи. Знак & создаёт настоящую ссылку на ту же переменную.

💬 Обратная связь Проверяем выросло ли число помидоров синьоров :) Ваш текущий грейд: 🔥 — Senior 👍🏼 — Middle ❤️ — Junior 😁 — Ещё учусь

🤖 Большинство материалов по ИИ-агентам устаревают быстрее, чем многие курсы успевают обновить программу Инструменты, подходы
🤖 Большинство материалов по ИИ-агентам устаревают быстрее, чем многие курсы успевают обновить программу Инструменты, подходы и фреймворки меняются постоянно. Поэтому важно не просто собрать демо-агента, а понимать архитектуру, ограничения и практики, которые используются в продакшене. 🚀 30 июня стартует курс «Разработка ИИ-агентов». ⏳ До 20 июня действует сниженная цена. За 8 недель под руководством практиков из бигтеха вы соберёте собственного AI-агента, который работает с API, использует память, подключается к внешним сервисам и решает реальную задачу. Что разберём: 🔹 архитектуру AI-агентов и надёжный вывод; 🔹 LangGraph и оркестрацию workflow; 🔹 MCP и работу с внешними инструментами; 🔹 RAG-системы; 🔹 AgentOps, observability и evals; 🔹 безопасность и защиту от prompt injection; 🔹 мультиагентные системы и A2A. На курсе отдельно разбираем вопросы надёжности, безопасности и контроля агентных систем. 👉 Узнать программу и забронировать место со скидкой

Как работают замыкания и захват переменных? Замыкание — это анонимная функция (instanceof Closure). Внешние переменные захватываются явно через use: по значению или по ссылке use (&$x). $this захватывается автоматически, если замыкание создано внутри метода. bindTo() / Closure::bind() позволяют переопределить $this и область видимости, тогда замыкание получит доступ к private/protected. Стрелочные функции fn() => ... захватывают внешние переменные автоматически по значению.