Библиотека собеса по PHP | вопросы с собеседований
3.16K subscribers
191 photos
6 videos
126 links
Вопросы с собеседований по PHP и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/9f3affba

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Кажется, мы окончательно перешли от игрушек к суровому AgentOps

Приглашаем на наш обновлённый курс по разработке ИИ-агентов. Никакой воды про «будущее нейросетей», только инженерный подход.

На курсе мы:

— пошагово строим готовые системы на LangGraph, CrewAI и MCP;
— настраиваем кэширование и роутинг, чтобы бот не сожрал токены;
— разбираемся со стейтом, учимся дебажить через time-travel и прикручиваем human-in-the-loop;
— выводим RAG в прод так, чтобы безопасники не завернули архитектуру из-за 152-ФЗ.

В пекло скучные лекции про общую инфраструктуру — сразу фокусируемся на агентных фреймворках и написании кода. Занятия ведут бывалые лиды из Газпромбанка и Альфы, набившие шишки на реальных задачах.

Кстати, на днях мы пилили агента в прямом эфире, если пропустили — есть запись вебинара.


Сегодня последний день, когда можно забрать курс по старым ценам. Базовый тариф сейчас стоит 49 000 ₽ (вместо 62 990 ₽), продвинутый трек — 99 000 ₽ (вместо 124 990 ₽). Если не хочется отдавать всю сумму сразу, есть рассрочка. Торопитесь — на потоке осталось всего 5 мест!

Зафиксировать цену и перейти к сборке своих агентов
Что такое PSR и зачем это нужно?

PSR (PHP Standards Recommendations) — набор стандартов от PHP-FIG, которые обеспечивают совместимость кода между проектами и пакетами.

Ключевые стандарты:

• PSR-1 / PSR-12 — стиль кода (отступы, имена классов, методов)
• PSR-4 — автозагрузка: пространство имён → путь к файлу
• PSR-3 — интерфейс логгера (LoggerInterface)
• PSR-7 — HTTP-сообщения (Request / Response)
• PSR-11 — контейнер зависимостей (ContainerInterface)
• PSR-15 — HTTP middleware

Без PSR библиотеки несовместимы, composer не может их объединить, а команды пишут в разных стилях. PSR — это общий язык PHP-экосистемы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Что такое Dependency Injection?

DI — паттерн, при котором зависимости класса передаются извне, а не создаются внутри.

// Плохо — жёсткая связанность:
class OrderService {
private $mailer;
public function __construct() {
$this->mailer = new SmtpMailer(); // зависимость зашита внутри
}
}

// Хорошо — DI:
class OrderService {
public function __construct(private MailerInterface $mailer) {}
}


Зачем:


✔️ Легко подменить реализацию (например, для тестов — MockMailer)
✔️ Классы не знают о конкретных реализациях (зависимость от абстракции)
✔️ Код легче тестировать, поддерживать, расширять

DI Container (Symfony, Laravel) автоматизирует создание объектов и внедрение зависимостей по всему приложению.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥1
Что такое магические методы? Назови основные.

Магические методы — методы с двойным подчёркиванием, которые PHP вызывает автоматически в определённых ситуациях.

__construct() / __destruct() — создание и уничтожение объекта
__get($name) / __set($name, $value) — обращение к несуществующему свойству
__isset($name) / __unset($name) — isset() / unset() на несуществующем свойстве
__call($name, $args) — вызов несуществующего метода экземпляра
__callStatic($name, $args) — вызов несуществующего статического метода
__toString() — приведение объекта к строке
__invoke() — вызов объекта как функции
__clone() — после clone()
__sleep() / __wakeup() — перед serialize() / после unserialize()
__debugInfo() — что показывать в var_dump()
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Как работают генераторы?

Генератор — функция с yield, которая возвращает значения по одному, не загружая всё в память.

function readLargeFile(string $file): \Generator {
$handle = fopen($file, 'r');
while (!feof($handle)) {
yield fgets($handle);
}
fclose($handle);
}

foreach (readLargeFile('10gb.log') as $line) {
process($line);
}


Без генератора file() загрузил бы весь файл в массив → OutOfMemoryError.

Генератор реализует интерфейс Iterator. Ключевые отличия от обычной функции:

• Выполнение приостанавливается на yield
• Возобновляется при следующем обращении к итератору
• yield from позволяет делегировать другому генератору

Применение: обработка больших файлов, пагинация из DB, потоковая генерация данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁3🔥2
✔️ PHP-тест: Typed Properties + Lazy Initialization + Объект в статике

Баг, который живёт в проде месяцами и проявляется только под нагрузкой 👇

📦 Задание

Команда пишет модуль биллинга. Ты написал быстрый класс-обёртку для работы с тарифами. Код прошёл ревью, всё работало на стейджинге. В проде через неделю начались жалобы: у части пользователей неправильно считается стоимость. Причём только в пиковые часы.

// src/Billing/TariffCalculator.php
class TariffCalculator
{
private static TariffConfig $config;
private static array $cache = [];

public static function init(array $rawConfig): void
{
self::$config = new TariffConfig($rawConfig);
}

public static function calculate(int $userId, int $units): float
{
$key = $userId . ':' . $units;

if (isset(self::$cache[$key])) {
return self::$cache[$key];
}

$price = self::$config->getBasePrice()
* $units
* self::$config->getUserMultiplier($userId);

self::$cache[$key] = $price;

return $price;
}

public static function resetCache(): void
{
self::$cache = [];
}
}

// src/Billing/TariffConfig.php
class TariffConfig
{
private float $basePrice;
private array $multipliers;

public function __construct(array $config)
{
$this->basePrice = (float) $config['base_price'];
$this->multipliers = $config['multipliers'] ?? [];
}

public function getBasePrice(): float
{
return $this->basePrice;
}

public function getUserMultiplier(int $userId): float
{
return $this->multipliers[$userId] ?? 1.0;
}
}

// bootstrap.php — вызывается один раз при старте воркера
TariffCalculator::init(loadConfigFromDB());

// Где-то в обработчике запроса
$price = TariffCalculator::calculate($user->id, $request->units);


🔹 Задачи

— Найти все архитектурные и логические проблемы в коде (их несколько)
— Объяснить, почему баг проявляется только под нагрузкой и не воспроизводится на стейджинге
— Предложить правильное решение

Ставьте → 🔥 если нравится формат. Если нет → 🌚

💬 Решения пишите в комменты под спойлер — сравним подходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42👍1