PHP задачи с собеседований
2.88K subscribers
601 photos
6 videos
11 files
351 links
Задачи, тесты и теоретические вопросы по PHP.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
Проектируешь сервис обработки платежей. Тебе нужно реализовать метод, который принимает данные платежа и возвращает результат.
🔥2
Какую функцию нужно использовать, чтобы зарегистрировать собственный обработчик ошибок?
Anonymous Poll
5%
register_shutdown_function()
5%
error_log()
18%
register_handler_function()
4%
trigger_error()
72%
set_error_handler()
Что выведет фрагмент кода?
Anonymous Poll
26%
Fatal error
8%
int(0)
59%
int(2)
8%
int(5)
Какое значение по умолчанию принимает директива memory_limit в PHP?
Anonymous Poll
24%
64M
66%
128M
7%
256M
5%
512M
Какая аномалия возникает, когда транзакция выполняет один и тот же запрос дважды, и во второй раз получает дополнительные строки, которые были добавлены другой транзакцией?
Anonymous Poll
27%
Dirty Read
16%
Dirty Write
18%
Phantom Write
41%
Phantom Read
Что действительно ускоряет автозагрузку на проде?
Anonymous Poll
37%
composer install --no-dev
2%
composer diagnose
24%
opcache.revalidate_freq=0
47%
composer dump-autoload -o
DDD — границы агрегатов. За соблюдение кредитного лимита клиента при создании заказа кто отвечает?
Anonymous Poll
29%
Агрегатор Order
63%
Агрегат Customer (или доменный сервис вокруг него)
3%
Инфраструктурный валидатор в БД
6%
Сервис корзина
❓ Что такое 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) автоматизирует создание объектов и внедрение зависимостей по всему приложению.
Какая из следующих функций используется для выбора одного или нескольких случайных значений из массива PHP?
Anonymous Poll
80%
array_rand()
17%
array_random()
3%
rand_array()
0%
random_array()
💬 Обратная связь

Как часто вы проходите собеседования?

🔥 — Сейчас активно ищу работу
👍🏼 — Раз в несколько месяцев
❤️ — Раз в полгода-год
😁 — Не прохожу, уже работаю/ещё учусь
🔥4
Что выведет код?
❓ Чем отличается Optimistic Lock от Pessimistic Lock?

Pessimistic Lock — блокируем строку в БД на время транзакции. Никто другой не может её изменить до снятия блокировки.

SELECT * FROM orders WHERE id = 1 FOR UPDATE;

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

Optimistic Lock — блокировки нет. У записи есть поле version. При обновлении проверяем, что версия не изменилась:

UPDATE orders SET status = 'paid', version = 6
WHERE id = 1 AND version = 5;

Если affected_rows = 0 — кто-то успел раньше, делаем retry или возвращаем ошибку.

Применять когда: конфликты редки, операции долгие (нельзя держать блокировку), высокий параллелизм.
Минус: нужен retry-механизм, сложнее реализовать корректно.
👍3
Случайно сделал коммит с ошибкой. Как быстро исправить не создавая новый?
Anonymous Poll
20%
git revert
18%
git revert HEAD
43%
git commit -- amend
23%
git commit -- revert
💬 Обратная связь

Текущий уровень сложности задачек?

🔥 — Слишком просто, хочу сложнее
👍🏼 — В самый раз
❤️ — Иногда сложновато
😁 — Часто не понимаю
🔥4👍2
❓ Что такое событийно-ориентированная архитектура?

Event-driven architecture — это когда компоненты общаются через события, не зная друг о друге напрямую.

// Событие:
class UserRegistered {
public function __construct(public readonly User $user) {}
}

// Listener:
class SendWelcomeEmail {
public function handle(UserRegistered $event): void {
$this->mailer->send($event->user->email, 'Welcome!');
}
}

// Диспетчер:
$dispatcher->dispatch(new UserRegistered($user));

Зачем

✔️ Слабая связанность (UserService не знает о SendWelcomeEmail)
✔️ Легко добавить новый listener без изменения существующего кода (Open/Closed)
✔️ Можно делать асинхронные listeners (через очередь)

В Laravel: Event / Listener, EventServiceProvider.
В Symfony: EventDispatcher, декларация через атрибуты.

Подводный камень: сложно трейсить цепочку — одно событие вызывает другое.