成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【modernPHP專題(7)】生成器語法

jackwang / 1462人閱讀

摘要:通過生成器來生成關(guān)聯(lián)數(shù)組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產(chǎn)生的是一個,它的成員變量與函數(shù)不存在別名引用關(guān)系。關(guān)鍵字在的版本,生成器允許從其他生成器,可迭代對象或數(shù)組通過關(guān)鍵字來生成對應的值輸出

一般你在迭代一組數(shù)據(jù)的時候,需要創(chuàng)建一個數(shù)據(jù),假設(shè)數(shù)組很大,則會消耗很大性能,甚至造成內(nèi)存不足。

//Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 32 bytes) 
range(1, 100000000);

PHP5.5實現(xiàn)了生成器,每當產(chǎn)生一個數(shù)組元素則用yield關(guān)鍵詞返回,并且執(zhí)行函數(shù)暫停,當執(zhí)行函數(shù)next方法時,則會從上一次被yield的位置開始繼續(xù)執(zhí)行,如下例子,只會產(chǎn)生中間變量$i,并只在每次循環(huán)的賦值;

function xrange($start, $limit, $step = 1) {
    for ($i = $start; $i <= $limit; $i += $step) {
     //注意變量$i的值在不同的yield之間是保持傳遞的。
        yield $i;
    }
}

$generator = xrange(1, 100000000, 1);

// 可以通過foreach獲得;
foreach ($generator as $number) {
   echo  "$number";
   echo PHP_EOL;
}

// 由于生成器其實是一個實現(xiàn)了iterator接口的類,所以也可以通過相關(guān)的iterator方法來迭代
// var_dump($generator)  class Generator#1 (0) {}
// Generator implements Iterator {}

$generator->rewind();
while ($generator->valid()){
    echo $generator->current();
    echo PHP_EOL;
    $generator->next();
}

生成器函數(shù)的核心是yield關(guān)鍵字。它最簡單的調(diào)用形式看起來像一個return申明,不同之處在于普通return會返回值并終止函數(shù)的執(zhí)行,而yield會返回一個值給循環(huán)調(diào)用此生成器的代碼并且只是暫停執(zhí)行生成器函數(shù)。

通過生成器來生成關(guān)聯(lián)數(shù)組
/*
 * 下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。
 */
$input = <<<"EOF"
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
EOF;

function input_parser($input) {
    foreach (explode("
", $input) as $line) {
        $fields = explode(";", $line);
        $id = array_shift($fields);
        yield $id => $fields;
    }
}

foreach (input_parser($input) as $id => $fields) {
    echo "$id:
";
    echo "    $fields[0]
";
    echo "    $fields[1]
";
}
/*
    1:
        PHP
        Likes dollar signs
    2:
        Python
        Likes whitespace
    3:
        Ruby
        Likes blocks
 */
生成NULL值

略;

使用引用來生成值

先了解一下從函數(shù)返回一個引用的概念

手冊解釋: 引用返回用在當想用函數(shù)找到引用應該被綁定在哪一個變量上面時。不要用返回引用來增加性能,引擎足夠聰明來自己進行優(yōu)化。僅在有合理的技術(shù)原因時才返回引用!要返回引用,使用此語法:

Example: 使用返回引用

class foo{
    public $value = 42;

    public function &getValue()
    {
        return $this->value;
    }
}

$obj = new foo;
// $myValue is a reference to $obj->value, which is 42.
// $myValue 是 $obj->value 的引用,它們的值都是 42
$myValue = &$obj->getValue();
// 對 $obj->value 重新賦值,會影響到 $myValue 的值
$obj->value = 2;
// prints the new value of $obj->value, i.e. 2.
echo $myValue;    // 程序輸出 2

Example: 沒有使用返回引用

class foo {
    public $value = 42;

    public function getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = $obj->getValue();
$obj->value = 2;

echo $obj->value;  // 輸出 2
echo $myValue;     //  輸出42, 因為返回的是當時值的一個副本;

函數(shù) &getValue() 把引用綁定在成員變量 $value 上了。正常來說,$obj = new foo; 產(chǎn)生的 $obj 是一個copy,它的成員變量 $value 與函數(shù) getValue() 不存在“別名”(引用)關(guān)系。

Example: 通過引用來生成值

function &gen_reference() {
    $value = 3;
    while ($value > 0) {
        yield $value;
    }
}

/*
 * 我們可以在循環(huán)中修改$number的值,而生成器是使用的引用值來生成,所以gen_reference()內(nèi)部的$value值也會跟著變化。
 */
foreach (gen_reference() as &$number) {
    echo (--$number)."...";//改變的是gen_reference()里面的$value值;這樣里面的循環(huán)就不是死循環(huán)了。
}
yield from關(guān)鍵字

在PHP7的版本,生成器允許從其他生成器,可迭代對象或數(shù)組通過yield from關(guān)鍵字來生成對應的值;

function count_to_ten() {
    yield 1;
    yield 2;
    yield from [3, 4];
    yield from new ArrayIterator([5, 6]);
    yield from seven_eight();
    yield 9;
    yield 10;
}

function seven_eight() {
    yield 7;
    yield from eight();
}

function eight() {
    yield 8;
}

foreach (count_to_ten() as $num) {
    echo "$num ";
}

// 輸出1 2 3 4 5 6 7 8 9 10 

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31400.html

相關(guān)文章

  • modernPHP專題(1)】php7常用特性整理

    摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數(shù)錯誤的報告方式。不同于傳統(tǒng)的錯誤報告機制,現(xiàn)在大多數(shù)錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...

    Render 評論0 收藏0
  • modernPHP專題(13)】ZendOpcache字節(jié)碼緩存

    摘要:概述字節(jié)碼緩存不是的新特性,有很多獨立的擴展可以實現(xiàn),比如和等,但是截至目前這些擴展都沒有集成到內(nèi)核,從開始,內(nèi)置了字節(jié)碼緩存功能,名為。開始之前,我們先來看看什么是字節(jié)碼緩存,以及字節(jié)碼緩存的作用是什么。該函數(shù)將重置整個字節(jié)碼緩存。 概述 字節(jié)碼緩存不是PHP的新特性,有很多獨立的擴展可以實現(xiàn),比如APC、eAccelerator和Xache等,但是截至目前這些擴展都沒有集成到PHP...

    KevinYan 評論0 收藏0
  • modernPHP專題(10)】理解output buffer

    摘要:磁盤高速緩存操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的速度,對高速緩存復制的訪問要比原始數(shù)據(jù)訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。 1. 磁盤高速緩存(Disk Cache) 操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的I/O速度,對高速緩存復制的訪問要比原始數(shù)據(jù)訪問更為高效。例如,正在運行的進程的指令既存儲在磁盤上,也存儲在物理內(nèi)存上,也被復...

    kelvinlee 評論0 收藏0
  • modernPHP專題(14)】內(nèi)置的http服務器

    摘要:起就在中內(nèi)置了服務器但只是提供開發(fā)測試使用,不推薦使用中生產(chǎn)環(huán)境中。因為這個服務器接受處理請求時順序執(zhí)行的,不能并發(fā)處理。這個內(nèi)置的服務器使用起來非常的方便,你只需要執(zhí)行下面的命令啟動服務器然后就可以訪問了。 PHP 5.4起就在CLI SAPI中內(nèi)置了web服務器,但只是提供開發(fā)測試使用,不推薦使用中生產(chǎn)環(huán)境中。因為這個服務器接受處理請求時順序執(zhí)行的,不能并發(fā)處理。 這個內(nèi)置的web...

    RancherLabs 評論0 收藏0
  • modernPHP專題(12)】魔術(shù)方法小結(jié)

    說明 魔術(shù)方法就是在特定場景下不需要調(diào)用而自動執(zhí)行的方法。因為有魔術(shù)方法,所以我們的類可以寫得很靈活~ __construct #構(gòu)造方法,在類被實例化時自動調(diào)用,一般用于初始化操作; __destruct #析構(gòu)方法,對象被銷毀時自動調(diào)用; __clone() #克隆方法,當對象被克隆時,將會自動調(diào)用 __get($key) #屬性獲取...

    hearaway 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<