Библиотека собеса по PHP | вопросы с собеседований
رفتن به کانال در Telegram
Вопросы с собеседований по PHP и ответы на них. По рекламе: @proglib_adv Учиться у нас: clc.to/5JWKxA Для обратной связи: @proglibrary_feeedback_bot
نمایش بیشتر3 139
مشترکین
-124 ساعت
-87 روز
-1530 روز
آرشیو پست ها
❓ Чем INNER JOIN отличается от LEFT JOIN?
INNER JOIN возвращает только те строки, для которых нашлось совпадение в обеих таблицах. Если связи нет — строка не попадёт в результат.
LEFT JOIN возвращает все строки из левой таблицы плюс совпадающие из правой. Там, где совпадения нет, в столбцах правой таблицы будут NULL.
RIGHT JOIN — то же самое, но «главная» правая таблица.
⏰ Уже сегодня в 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 пишет код за вас? Это самое скучное, что он умеет
Основное время разработчик тратит на другое: разобраться в чужой кодовой базе, найти нужный участок проекта, проверить решение, собрать 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() => ... захватывают внешние переменные автоматически по значению.
❓ Для чего нужен nullsafe-оператор ?-> ?
Оператор ?-> (PHP 8): если значение слева равно null, вся цепочка коротко замыкается и возвращает null, а не падает с ошибкой обращения к свойству/методу. Это убирает каскад проверок if.
Важно: он спасает только от null и не делает цепочку «безопасной» от других ошибок, и его нельзя использовать в левой части присваивания.
💻 3 курса по цене одного — собери стек для оффера в топовую IT-компанию
Для следующего карьерного шага мало писать код. Работодатели ждут не только знания языка, но и понимания архитектуры, алгоритмов, автоматизации, AI-инструментов и агентных систем.
Одно направление закрывает только часть задачи.
Поэтому сейчас мы предлагаем освоить сразу несколько востребованных навыков — выбери любой курс и получи доступ еще к двум бесплатно 🔥
Собери стек навыков под свою цель:
🔹 подготовка к сильным компаниям (алгоритмы, архитектура);
🔹 переход в AI-направление (ИИ-агенты, AgentOps);
🔹 развитие в ML и Data Science (математика, основы ML);
🔹 новый оффер и рост дохода.
Полученные знания применяешь в работе уже во время обучения.
⏳ Акция действует 48 часов — 13 и 14 июня.
👉 Переходи на сайт, выбирай курсы и оставляй заявку — за 10 минут поможем собрать комплект под твою цель.
❓ Как работает автозагрузка по стандарту PSR-4?
PSR-4 маппит пространство имён на путь в файловой системе: префикс неймспейса соответствует базовой директории, остальная часть — подпапкам, а имя класса равно имени .php-файла.
Composer по секции autoload в composer.json генерирует автолоадер, регистрируя его через spl_autoload_register.
Класс подгружается лениво при первом обращении к нему, а не заранее.
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
