锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷

(PHP 5 >= 5.5.0, PHP 7)

锟斤拷锟斤拷锟斤拷锟结供锟斤拷一锟街革拷锟斤拷锟阶的凤拷锟斤拷锟斤拷实锟街简单碉拷锟斤拷锟斤拷锟斤拷锟�锟斤拷锟斤拷冉隙锟斤拷锟斤拷锟绞碉拷锟� Iterator 锟接口的凤拷式锟斤拷锟斤拷锟杰匡拷锟斤拷锟酵革拷锟斤拷锟皆达拷蠼档汀锟�

锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 foreach 锟斤拷锟斤拷锟斤拷锟叫达拷锟斤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟斤拷锟斤拷荻锟斤拷锟斤拷锟揭拷锟斤拷诖锟斤拷写锟斤拷锟揭伙拷锟斤拷锟斤拷锟�, 锟角伙拷使锟斤拷锟斤拷诖锟斤到锟斤拷锟睫o拷锟斤拷锟竭伙拷占锟捷可观的达拷锟斤拷时锟戒。锟洁反锟斤拷锟斤拷锟斤拷锟叫匆伙拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟斤拷锟酵拷锟斤拷远锟斤拷锟�锟斤拷锟斤拷一锟斤拷, 锟斤拷锟斤拷通锟斤拷锟斤拷只锟斤拷锟斤拷一锟轿诧拷同锟斤拷锟斤拷, 锟斤拷锟斤拷锟斤拷锟斤拷锟皆革拷锟斤拷锟斤拷要 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.