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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

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

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

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

  • Data Scientist1 142
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 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 вакансии
  • PHP Developer with React
  • Senior PHP Developer (SaaS)
  • Fullstack Developer (React, Next.js, PHP, AI)
  • PHP Developer
  • Senior Full-Stack Engineer (NestJS and React) (#6021)