Generators are useful when you need to generate a large collection to later iterate over. They're a simpler alternative to creating a class that implements an Iterator, which is often overkill.
For example, consider the below function.
function randomNumbers(int $length)
{
$array = [];
for ($i = 0; $i < $length; $i++) {
$array[] = mt_rand(1, 10);
}
return $array;
}
All this function does is generates an array that's filled with random numbers. To use it, we might do randomNumbers(10)
, which will give us an array of 10 random numbers. What if we want to generate one million random numbers? randomNumbers(1000000)
will do that for us, but at a cost of memory. One million integers stored in an array uses approximately 33 megabytes of memory.
$startMemory = memory_get_usage();
$randomNumbers = randomNumbers(1000000);
echo memory_get_usage() - $startMemory, ' bytes';
This is due to the entire one million random numbers being generated and returned at once, rather than one at a time. Generators are an easy way to solve this issue.