成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

jackwang / 1542人閱讀

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

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

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

PHP5.5實(shí)現(xiàn)了生成器,每當(dāng)產(chǎn)生一個(gè)數(shù)組元素則用yield關(guān)鍵詞返回,并且執(zhí)行函數(shù)暫停,當(dāng)執(zhí)行函數(shù)next方法時(shí),則會(huì)從上一次被yield的位置開始繼續(xù)執(zhí)行,如下例子,只會(huì)產(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;
}

// 由于生成器其實(shí)是一個(gè)實(shí)現(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)鍵字。它最簡(jiǎn)單的調(diào)用形式看起來像一個(gè)return申明,不同之處在于普通return會(huì)返回值并終止函數(shù)的執(zhí)行,而yield會(huì)返回一個(gè)值給循環(huán)調(diào)用此生成器的代碼并且只是暫停執(zhí)行生成器函數(shù)。

通過生成器來生成關(guān)聯(lián)數(shù)組
/*
 * 下面每一行是用分號(hào)分割的字段組合,第一個(gè)字段將被用作鍵名。
 */
$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ù)返回一個(gè)引用的概念

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

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();
// 對(duì) $obj->value 重新賦值,會(huì)影響到 $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, 因?yàn)榉祷氐氖钱?dāng)時(shí)值的一個(gè)副本;

函數(shù) &getValue() 把引用綁定在成員變量 $value 上了。正常來說,$obj = new foo; 產(chǎn)生的 $obj 是一個(gè)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值也會(huì)跟著變化。
 */
foreach (gen_reference() as &$number) {
    echo (--$number)."...";//改變的是gen_reference()里面的$value值;這樣里面的循環(huán)就不是死循環(huán)了。
}
yield from關(guān)鍵字

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

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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/31400.html

相關(guān)文章

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

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

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

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

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

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

    kelvinlee 評(píng)論0 收藏0
  • modernPHP專題(14)】?jī)?nèi)置的http服務(wù)器

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

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

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

    hearaway 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<