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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Как работают генераторы?

Генератор — функция с 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