����������

(PHP 5 >= 5.5.0, PHP 7)

�������ṩ��һ�ָ����׵ķ�����ʵ�ּ򵥵������������Ƚ϶�����ʵ�� Iterator �ӿڵķ�ʽ�����ܿ����͸����Դ�󽵵͡�

�������������� foreach �������д����������һ�����ݶ�����Ҫ���ڴ��д���һ������, �ǻ�ʹ����ڴ�ﵽ���ޣ����߻�ռ�ݿɹ۵Ĵ���ʱ�䡣�෴�������дһ������������������һ����ͨ���Զ�������һ��, ����ͨ����ֻ����һ�β�ͬ����, ���������Ը�����Ҫ yield ��Σ��Ա�������Ҫ������ֵ��

һ���򵥵����Ӿ���ʹ��������������ʵ�� range() ������ ��׼�� range() ������Ҫ���ڴ�������һ���������ÿһ��������Χ�ڵ�ֵ��Ȼ�󷵻ظ�����, ������ǻ��������ܴ�����顣 ���磬���� range(0, 1000000) �������ڴ�ռ�ó��� 100 MB��

��Ϊһ���������, ���ǿ���ʵ��һ�� xrange() ������, ֻ��Ҫ�㹻���ڴ������� Iterator �������ڲ������������ĵ�ǰ״̬������ֻ��Ҫ����1K�ֽڵ��ڴ档

Example #1 �� range() ʵ��Ϊ������

<?php
function xrange($start$limit$step 1) {
    if (
$start $limit) {
        if (
$step <= 0) {
            throw new 
LogicException('Step must be +ve');
        }

        for (
$i $start$i <= $limit$i += $step) {
            yield 
$i;
        }
    } else {
        if (
$step >= 0) {
            throw new 
LogicException('Step must be -ve');
        }

        for (
$i $start$i >= $limit$i += $step) {
            yield 
$i;
        }
    }
}

/* 
 * ע������range()��xrange()����Ľ����һ���ġ�
 */

echo 'Single digit odd numbers from range():  ';
foreach (
range(192) as $number) {
    echo 
"$number ";
}
echo 
"\n";

echo 
'Single digit odd numbers from xrange(): ';
foreach (
xrange(192) as $number) {
    echo 
"$number ";
}
?>

�������̻������

Single digit odd numbers from range():  1 3 5 7 9 
Single digit odd numbers from xrange(): 1 3 5 7 9 

Generator objects

When a generator function is called for the first time, an object of the internal Generator class is returned. This object implements the Iterator interface in much the same way as a forward-only iterator object would, and provides methods that can be called to manipulate the state of the generator, including sending values to and returning values from it.