Yield (англ. - урожай, производить) — это ключевое слово, используемое для создания генераторов в PHP. Генераторы — это функции, которые позволяют работать с большими наборами данных, используя меньше памяти, поскольку они не требуют загрузки всего набора данных в память сразу. Вместо этого они генерируют и возвращают значения по одному на каждом шаге итерации. Это делает генераторы идеальными для работы с потоками данных или большими файлами.
Когда выполнение функции доходит до yield, функция возвращает значение генератору и приостанавливает своё выполнение, сохраняя состояние всех локальных переменных. При следующем вызове генератора выполнение продолжается с того места, где оно было приостановлено.
Пример:
В этом примере generate_numbers - это функция-генератор, которая принимает два аргумента - начальное и конечное значение. Она содержит цикл for, который перебирает все числа от $start до $end и каждое число возвращает с помощью оператора yield.
При вызове функции generate_numbers(1, 10) создается объект-генератор, который можно перебирать с помощью цикла foreach. В этом цикле для каждого значения, возвращенного генератором, вызывается echo. Результат выполнения этого примера будет вывод чисел от 1 до 10 через пробел.
function generate_numbers( $start, $end )
{
for( $i = $start; $i <= $end; $i++ )
{
yield $i;
}
}
foreach( generate_numbers( 1, 10 ) as $number )
{
echo $number . ' ';
}
Генераторы позволяют вам не загружать весь файл в память, что очень удобно при работе с большими файлами. Вот пример функции, которая использует yield для чтения большого CSV-файла построчно: функция readCsv открывает файл и читает его построчно, используя fgetcsv. Она использует yield для возврата текущей строки из файла. Это позволяет вызывающему коду обрабатывать строки файла одну за другой без необходимости загружать весь файл в память.
function readCsv( $fileName )
{
if( !file_exists( $fileName ) || !is_readable( $fileName ) )
{
return;
}
$handle = fopen( $fileName, 'r' );
while( !feof( $handle ) )
{
$data = fgetcsv( $handle );
if( $data === false )
{
continue;
}
yield $data;
}
fclose( $handle );
}
$csvFileName = 'large_file.csv';
foreach( readCsv( $csvFileName ) as $rowIndex => $row )
{
echo "Строка $rowIndex: " . implode(', ', $row) . PHP_EOL;
}
Комментарии
0Нашли ошибку или хотите дополнить материал?