摘要:通過生成器來生成關聯數組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產生的是一個,它的成員變量與函數不存在別名引用關系。關鍵字在的版本,生成器允許從其他生成器,可迭代對象或數組通過關鍵字來生成對應的值輸出
一般你在迭代一組數據的時候,需要創建一個數據,假設數組很大,則會消耗很大性能,甚至造成內存不足。
//Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 32 bytes) range(1, 100000000);
PHP5.5實現了生成器,每當產生一個數組元素則用yield關鍵詞返回,并且執行函數暫停,當執行函數next方法時,則會從上一次被yield的位置開始繼續執行,如下例子,只會產生中間變量$i,并只在每次循環的賦值;
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; } // 由于生成器其實是一個實現了iterator接口的類,所以也可以通過相關的iterator方法來迭代 // var_dump($generator) class Generator#1 (0) {} // Generator implements Iterator {} $generator->rewind(); while ($generator->valid()){ echo $generator->current(); echo PHP_EOL; $generator->next(); }
生成器函數的核心是yield關鍵字。它最簡單的調用形式看起來像一個return申明,不同之處在于普通return會返回值并終止函數的執行,而yield會返回一個值給循環調用此生成器的代碼并且只是暫停執行生成器函數。
通過生成器來生成關聯數組/* * 下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。 */ $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值
略;
使用引用來生成值先了解一下從函數返回一個引用的概念
手冊解釋: 引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時。不要用返回引用來增加性能,引擎足夠聰明來自己進行優化。僅在有合理的技術原因時才返回引用!要返回引用,使用此語法:
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, 因為返回的是當時值的一個副本;
函數 &getValue() 把引用綁定在成員變量 $value 上了。正常來說,$obj = new foo; 產生的 $obj 是一個copy,它的成員變量 $value 與函數 getValue() 不存在“別名”(引用)關系。
Example: 通過引用來生成值
function &gen_reference() { $value = 3; while ($value > 0) { yield $value; } } /* * 我們可以在循環中修改$number的值,而生成器是使用的引用值來生成,所以gen_reference()內部的$value值也會跟著變化。 */ foreach (gen_reference() as &$number) { echo (--$number)."...";//改變的是gen_reference()里面的$value值;這樣里面的循環就不是死循環了。 }yield from關鍵字
在PHP7的版本,生成器允許從其他生成器,可迭代對象或數組通過yield from關鍵字來生成對應的值;
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31400.html
摘要:它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數錯誤的報告方式。不同于傳統的錯誤報告機制,現在大多數錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
摘要:概述字節碼緩存不是的新特性,有很多獨立的擴展可以實現,比如和等,但是截至目前這些擴展都沒有集成到內核,從開始,內置了字節碼緩存功能,名為。開始之前,我們先來看看什么是字節碼緩存,以及字節碼緩存的作用是什么。該函數將重置整個字節碼緩存。 概述 字節碼緩存不是PHP的新特性,有很多獨立的擴展可以實現,比如APC、eAccelerator和Xache等,但是截至目前這些擴展都沒有集成到PHP...
摘要:磁盤高速緩存操作系統中使用磁盤高速緩存技術來提高磁盤的速度,對高速緩存復制的訪問要比原始數據訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內存中的盤塊。 1. 磁盤高速緩存(Disk Cache) 操作系統中使用磁盤高速緩存技術來提高磁盤的I/O速度,對高速緩存復制的訪問要比原始數據訪問更為高效。例如,正在運行的進程的指令既存儲在磁盤上,也存儲在物理內存上,也被復...
摘要:起就在中內置了服務器但只是提供開發測試使用,不推薦使用中生產環境中。因為這個服務器接受處理請求時順序執行的,不能并發處理。這個內置的服務器使用起來非常的方便,你只需要執行下面的命令啟動服務器然后就可以訪問了。 PHP 5.4起就在CLI SAPI中內置了web服務器,但只是提供開發測試使用,不推薦使用中生產環境中。因為這個服務器接受處理請求時順序執行的,不能并發處理。 這個內置的web...
說明 魔術方法就是在特定場景下不需要調用而自動執行的方法。因為有魔術方法,所以我們的類可以寫得很靈活~ __construct #構造方法,在類被實例化時自動調用,一般用于初始化操作; __destruct #析構方法,對象被銷毀時自動調用; __clone() #克隆方法,當對象被克隆時,將會自動調用 __get($key) #屬性獲取...
閱讀 1792·2021-09-03 10:50
閱讀 1326·2019-08-30 15:55
閱讀 3368·2019-08-30 15:52
閱讀 1230·2019-08-30 15:44
閱讀 934·2019-08-30 15:44
閱讀 3318·2019-08-30 14:23
閱讀 3550·2019-08-28 17:51
閱讀 2290·2019-08-26 13:52