摘要:通過生成器來生成關(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
摘要:它使得在生產(chǎn)環(huán)境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數(shù)錯誤的報告方式。不同于傳統(tǒng)的錯誤報告機制,現(xiàn)在大多數(shù)錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環(huán)境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
摘要:概述字節(jié)碼緩存不是的新特性,有很多獨立的擴展可以實現(xiàn),比如和等,但是截至目前這些擴展都沒有集成到內(nèi)核,從開始,內(nèi)置了字節(jié)碼緩存功能,名為。開始之前,我們先來看看什么是字節(jié)碼緩存,以及字節(jié)碼緩存的作用是什么。該函數(shù)將重置整個字節(jié)碼緩存。 概述 字節(jié)碼緩存不是PHP的新特性,有很多獨立的擴展可以實現(xiàn),比如APC、eAccelerator和Xache等,但是截至目前這些擴展都沒有集成到PHP...
摘要:磁盤高速緩存操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的速度,對高速緩存復制的訪問要比原始數(shù)據(jù)訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內(nèi)存中的盤塊。 1. 磁盤高速緩存(Disk Cache) 操作系統(tǒng)中使用磁盤高速緩存技術(shù)來提高磁盤的I/O速度,對高速緩存復制的訪問要比原始數(shù)據(jù)訪問更為高效。例如,正在運行的進程的指令既存儲在磁盤上,也存儲在物理內(nèi)存上,也被復...
摘要:起就在中內(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...
說明 魔術(shù)方法就是在特定場景下不需要調(diào)用而自動執(zhí)行的方法。因為有魔術(shù)方法,所以我們的類可以寫得很靈活~ __construct #構(gòu)造方法,在類被實例化時自動調(diào)用,一般用于初始化操作; __destruct #析構(gòu)方法,對象被銷毀時自動調(diào)用; __clone() #克隆方法,當對象被克隆時,將會自動調(diào)用 __get($key) #屬性獲取...
閱讀 1815·2021-09-03 10:50
閱讀 1341·2019-08-30 15:55
閱讀 3386·2019-08-30 15:52
閱讀 1245·2019-08-30 15:44
閱讀 959·2019-08-30 15:44
閱讀 3329·2019-08-30 14:23
閱讀 3565·2019-08-28 17:51
閱讀 2301·2019-08-26 13:52