Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+659новых вакансий за сутки·52 454вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 688
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 392 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python6 033
  • Облачные технологии4 127
  • QA вакансии1 598
  • Android1 134
  • Инженер данных767
  • Продакт-менеджер295

Разработка

  • iOS1 084
  • Backend вакансии1 031
  • Fullstack вакансии444
  • AI вакансии385
  • Frontend вакансии371
  • Mobile вакансии27

По стеку

  • Go3 416
  • Java2 070
  • Kotlin926
  • Node.js731
  • Rust514
  • .NET462
  • PHP267
  • C++206
  • C#195

DevOps и инфраструктура

  • Kubernetes2 336
  • Linux-инфраструктура1 899
  • DevOps вакансии1 844
  • Terraform / IaC1 428
  • CI/CD848
  • Мониторинг и Observability650
  • SRE220
  • Кибербезопасность35

Аналитика и данные

  • Аналитик данных464
  • Data Scientist434
  • Бизнес-аналитик337
  • Системный аналитик48

Другие направления

  • Проджект-менеджер101
  • UI/UX дизайн69
  • Ручное тестирование14

По регионам

  • Вакансии в США23 332
  • Вакансии в Европе9 074
  • Работа в России2 931
  • Вакансии в Канаде2 054

По формату

  • Удалённые вакансии40 752
  • Релокация в США23 332
  • Гибридная работа3 446
  • Офисная работа2 568

По уровню

  • Senior вакансии19 645
  • Middle вакансии11 602
  • Junior вакансии3 620

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise94 вакансии
  • Infobip28 вакансий
  • Spotify18 вакансий
  • Celonis17 вакансий
  • Darktrace17 вакансий
  • Adyen13 вакансий
  • UiPath13 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме PHPВсе вопросы
PHPMiddleКодинг

Что такое generators в PHP и когда их стоит использовать?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Generator — функция с yield, возвращающая объект Generator. Используется для ленивой обработки больших наборов данных без загрузки всего в память: чтение файлов построчно, потоковая пагинация, бесконечные последовательности.

Базовый пример

<?php
declare(strict_types=1);

// Генератор бесконечной последовательности
function fibonacci(): Generator {
    [$a, $b] = [0, 1];
    while (true) {
        yield $a;
        [$a, $b] = [$b, $a + $b];
    }
}

$gen = fibonacci();
for ($i = 0; $i < 10; $i++) {
    echo $gen->current() . "\n";
    $gen->next();
}
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

Что такое generators в PHP

Generator — специальный тип функции, содержащий оператор yield. При вызове такой функции PHP не выполняет тело, а возвращает объект класса Generator, реализующий интерфейс Iterator. Выполнение тела происходит лениво: каждый вызов ->current() / ->next() или итерация в foreach продвигает выполнение до следующего yield.

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

Практический пример: чтение большого CSV

<?php
declare(strict_types=1);

/**
 * Читает CSV построчно, не загружая файл целиком в память.
 * @return Generator<int, array<string, string>>
 */
function readCsv(string $path): Generator {
    $handle = fopen($path, 'r');
    if ($handle === false) {
        throw new \RuntimeException("Cannot open file: {$path}");
    }

    try {
        $headers = fgetcsv($handle);
        if ($headers === false) {
            return;
        }

        while (($row = fgetcsv($handle)) !== false) {
            yield array_combine($headers, $row);
        }
    } finally {
        fclose($handle);
    }
}

// Использование: memory_limit не зависит от размера файла
foreach (readCsv('/data/users.csv') as $index => $row) {
    processUser($row['email'], $row['name']);
}

yield from и делегирование

<?php
declare(strict_types=1);

function innerGenerator(): Generator {
    yield 1;
    yield 2;
    return 'inner_result'; // возвращаемое значение через getReturn()
}

function outerGenerator(): Generator {
    yield 0;
    $result = yield from innerGenerator(); // делегирует + получает return value
    yield 3;
    echo "Inner returned: {$result}\n"; // 'inner_result'
}

foreach (outerGenerator() as $value) {
    echo $value . "\n"; // 0, 1, 2, 3
}

Двунаправленная коммуникация: send()

<?php
declare(strict_types=1);

function accumulator(): Generator {
    $sum = 0;
    while (true) {
        $value = yield $sum; // yield возвращает значение, переданное через send()
        if ($value === null) {
            break;
        }
        $sum += $value;
    }
}

$gen = accumulator();
$gen->current(); // инициализация до первого yield
$gen->send(10); // sum = 10
$gen->send(20); // sum = 30
echo $gen->send(5); // 35

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

  • Чтение больших файлов (CSV, JSON Lines, лог-файлы) построчно.
  • Потоковая пагинация из БД: yield каждый batch, не загружая все строки.
  • Бесконечные последовательности (числа Фибоначчи, UUID, временные метки).
  • Пайплайны трансформаций: несколько generators, соединённых через yield from.
  • Кооперативная многозадачность в event loop (ReactPHP использует generators в старых API).

Подводные камни

  • Generator нельзя перемотать: rewind() вызывает Exception если генератор уже продвинулся. Для повторной итерации создавайте новый экземпляр.
  • Generator::getReturn() бросает Exception, если генератор ещё не завершён — вызывать только после того, как valid() вернул false.
  • Ресурсы (файловые дескрипторы, соединения с БД) в теле генератора не закрываются автоматически при раннем выходе из foreach — используйте try/finally.
  • Генераторы не сериализуются: нельзя передать объект Generator в очередь задач или кэш.
  • Производительность: overhead на каждый yield существенен для маленьких наборов данных. Для массива из 100 элементов обычный array_map быстрее.
  • Типизация: Generator<TKey, TValue, TSend, TReturn> — PHPStan и Psalm поддерживают generic-аннотации, без них статический анализ не проверяет типы значений.
  • yield from array работает, но ключи сохраняются из исходного массива — может сломать логику, ожидающую последовательные integer-ключи.
  • В Fibers (PHP 8.1) и generators схожая семантика приостановки, но они не взаимозаменяемы: Fiber приостанавливается через Fiber::suspend() изнутри любого стека вызовов, generator — только непосредственно в своём теле.

Частые вопросы на собеседовании

  • Как предотвратить SQL injection в PHP?
  • Что такое PHP traits и чем они отличаются от интерфейсов и абстрактных классов?
  • Каковы основные возможности PHP 8.x (named arguments, match expression, nullsafe operator, fibers)?
  • Что такое суперглобальные переменные (superglobals) в PHP? Назовите наиболее распространённые.

Типичные ошибки

  • Сводить generators к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: интерпретируемый runtime PHP 8.x, обычно запускаемый как отдельный запрос в FPM, CLI или worker-процессе.
  • Не отделять validation, authorization, transaction boundary и business logic.

Что проверяет интервьюер

  • Объясняет generators через конкретную точку lifecycle в PHP.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме PHP →

Источники

  • https://www.php.net/manual/en/language.generators.php
  • https://www.php.net/manual/en/
←Предыдущий вопросПредставьте, сервис на PHP стал медленнее или нестабильнее после релиза. Какие language/runtime-specific причины вы проверите?Следующий вопрос→Какие ошибки делают разработчики, переходящие на PHP с другого языка или стека?

Связанные темы

PHPBackend-Engineeringphp-ecosystem