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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Symfony основан на конфигурации или соглашениях?

Symfony — это фреймворк, основанный на соглашениях. Документ Coding Standards иллюстрирует нормы кодирования для проектов Symfony, а также внутренних и сторонних пакетов. Он определяет стандарты кодирования и соглашения, используемые в ядре фреймворка, чтобы сделать его более единообразным и предсказуемым.
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🔥1
Осталось всего 4 места на курс по ИИ-агентам. 30 апреля закрываем набор окончательно.

В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.

🏃‍♀️ Записаться, пока есть места
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
Что такое Bundles в Symfony?

В Symfony, Bundle — это структурированный набор файлов и директорий, реализующих определённую функцию или набор связанных функций. Бандлы являются основными единицами организации, позволяя упаковывать повторно используемый код и делиться им между несколькими проектами.

Ключевые аспекты

1️⃣ Структура и организация

Бандлы предоставляют способ организовать код в логические единицы. Каждый бандл обычно включает:

— Контроллеры
— Модели/Сущности
— Сервисы
— Конфигурационные файлы
— Шаблоны (файлы Twig)
— Информацию о маршрутах


2️⃣ Повторное использование

Бандлы могут быть повторно использованы в разных проектах. Это упрощает совместное использование и распространение функций и функциональных возможностей, способствуя модульности и поддерживаемости.

3️⃣ Разделение

Бандлы помогают разделить различные части приложения. Это разделение гарантирует, что изменения в одном бандле не влияют на функциональность других, что облегчает обслуживание и разработку.

4️⃣ Сторонние бандлы

У Symfony есть богатая экосистема сторонних бандлов, доступных через такие платформы, как Packagist. Эти бандлы можно легко интегрировать в проект для добавления различных функций, таких как аутентификация пользователей, обработка платежей или интеграция с API.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥1
✔️ PHP-тест: Утечка сессии между пользователями

Баг не воспроизводится локально. На проде один юзер видит чужие данные 👇

📦 Задание

Стартап запустил SaaS. Первые две недели тишина. А потом в поддержку прилетело: «Я зашёл в кабинет и увидел чужой аккаунт». В коде сессий и авторизации не трогали давно, там всё стабильно.

// src/Auth/UserSession.php
class UserSession
{
private static ?User $currentUser = null;

public static function set(User $user): void
{
self::$currentUser = $user;
}

public static function get(): ?User
{
return self::$currentUser;
}

public static function clear(): void
{
self::$currentUser = null;
}
}

// src/Middleware/AuthMiddleware.php
class AuthMiddleware
{
public function __construct(
private readonly UserRepository $userRepository,
private readonly JWTService $jwt,
) {}

public function handle(Request $request, callable $next): Response
{
$token = $request->headers->get('Authorization');

if (!$token) {
return new Response(status: 401);
}

$payload = $this->jwt->decode(str_replace('Bearer ', '', $token));
$user = $this->userRepository->find($payload['sub']);

UserSession::set($user);

return $next($request);
}
}

// src/Controller/DashboardController.php
class DashboardController
{
public function index(): Response
{
$user = UserSession::get();

return new Response(
body: $this->renderDashboard($user),
);
}
}

// src/Console/CacheWarmupCommand.php
class CacheWarmupCommand
{
public function execute(): void
{
$users = $this->userRepository->findAll();

foreach ($users as $user) {
UserSession::set($user);
$this->warmupForUser($user);
}

// прогрев завершён
}
}


🔹 Задачи

— Объяснить механизм утечки
— Объяснить, как CacheWarmupCommand триггерит баг и при каком race window
— Переписать UserSession так, чтобы устранить проблему архитектурно, а не патчем

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

💬 Решения пишите в комменты под спойлер — сравним подходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤔5🌚2👍1🥱1
Расскажите о паттерне Strategy?

Strategy — это поведенческий паттерн, который позволяет определить семейство алгоритмов, инкапсулировать каждый из них и сделать их взаимозаменяемыми.

Когда использовать:

есть несколько способов выполнения одной операции;
нужно избежать множественных if-else или switch;
алгоритмы должны выбираться в runtime.

Преимущества: соблюдение Open/Closed Principle, устранение условных операторов, гибкость выбора алгоритма
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5
Расскажите о паттерне Singleton?

Singleton — это порождающий паттерн проектирования, который гарантирует, что у класса существует только один экземпляр, и предоставляет глобальную точку доступа к нему.

🔹 Основные характеристики:

приватный конструктор запрещает создание экземпляров извне;
статический метод getInstance() возвращает единственный экземпляр;
статическое поле для хранения экземпляра.

🔹 Когда использовать:

объект содержит глобальное состояние;
создание объекта ресурсозатратно;
нужен единый координатор действий;
логически должен быть один экземпляр.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥31👍1
Расскажите о паттерне Adapter

Adapter (Адаптер) — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он выступает в роли "переходника" между двумя интерфейсами.

🔹 Когда использовать:

Когда нужно использовать существующий класс, но его интерфейс не соответствует требуемому. Например, при интеграции сторонних библиотек или работе с легаси-кодом.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥21
Расскажите о паттерне Factory Method

Factory Method — порождающий паттерн, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.

🔹 Когда использовать:

Когда заранее неизвестны типы и зависимости объектов, или когда нужно делегировать создание объектов подклассам.

🔹 Как работает:

Создается абстрактный метод для создания объектов, а конкретные подклассы переопределяют его, возвращая нужные типы.

🔹 Плюсы:

избавляет от привязки к конкретным классам;
упрощает добавление новых типов продуктов;
следует Open/Closed Principle.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍1👏1
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?

Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».

🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы

🧑🏻‍💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.

🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.

👉 Занять место на вебинаре
🌚1