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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python5 917
  • Облачные технологии4 462
  • QA вакансии1 683
  • Android1 136
  • Инженер данных753
  • Продакт-менеджер293

Разработка

  • iOS1 085
  • Backend вакансии982
  • Fullstack вакансии435
  • AI вакансии362
  • Frontend вакансии361
  • Mobile вакансии27

По стеку

  • Go3 333
  • Java2 015
  • Kotlin904
  • Node.js734
  • Rust490
  • .NET474
  • PHP271
  • C++208
  • C#191

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

  • Kubernetes2 532
  • Linux-инфраструктура2 017
  • DevOps вакансии1 827
  • Terraform / IaC1 535
  • CI/CD848
  • Мониторинг и Observability707
  • SRE221
  • Кибербезопасность37

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

  • Аналитик данных467
  • Data Scientist417
  • Бизнес-аналитик335
  • Системный аналитик49

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

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

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе9 026
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

Вакансии из 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

Вакансии с этим навыком

PHP вакансии
  • Senior / Lead PHP Engineer with AI skills (#5887)
  • Senior/ Lead PHP Engineer (with AI Skills) (#5828)
  • Senior Web Application Engineer, J.League Online Store - EC Expansion Development Department (ECEXD)
  • DX Solution Lead Engineer - Backoffice Business Support Section, Business Support Development Department (BSD)
  • Product Manager, Customer Strategy Department - Platform Strategy Supervisory Department (PFSD)