PHP生成器與函式引用的方法

2021-09-28 19:36:55 字數 1509 閱讀 1232

(php 5 >= 5.5.0, php 7)

生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現iterator介面的方式,效能開銷和複雜性大大降低。

生成器允許你在 foreach **塊中寫**來迭代一組資料而不需要在記憶體中建立乙個陣列, 那會使你的記憶體達到上限,或者會佔據可觀的處理時間。相反,你可以寫乙個生成器函式,就像乙個普通的自定義函式一樣, 和普通函式只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。

我們知道一般我們是在生成器內部生產需要的資料的,然後通過yield返回迭代出的值。如果我們需要在生成器外部影響或是生產資料,然後再通過yield返回呢。這時候我們就需要php的引用功能。

php 的引用允許用兩個變數來指向同乙個內容。php的引用不是指標,php的引用只是資料內容的別名。引用可以讓我們給同乙個變數資料起乙個或多個別名。

如果具有引用的陣列被拷貝,其值不會解除引用。對於陣列傳值給函式也是如此。

如果對乙個未定義的變數進行引用賦值、引用引數傳遞或引用返回,則會自動建立該變數。

自 php 5 起,new 自動返回引用,因此在此使用 =& 已經過時了並且會產生 e_strict 級別的訊息。

不用 & 運算子導致物件生成了乙個拷貝。如果在類中用 $this,它將作用於該類當前的例項。沒有用 & 的賦值將拷貝這個例項(例如物件)並且 $this 將作用於這個拷貝上,這並不總是想要的結果。由於效能和記憶體消耗的問題,通常只想工作在乙個例項上面。

儘管可以用 @ 運算子來抑制建構函式中的任何錯誤資訊,例如用 @new,但用 &new 語句時這不起效果。這是 zend 引擎的乙個限制並且會導致乙個解析錯誤。

如果我們想對php的函式做引用,那麼語法要求必須在函式的申明時就加上引用符號&。同時我們也需要在使用的地方加上引用符號&。

我們已經很清楚,如果想引用函式,我們必須在宣告時和使用時加上引用符號:&。所以我們把生成器函式加上引用符號&。然後再foreach裡面加上引用符號&。這樣就解決了我們本篇文章所想要的解決辦法。

只有當生成器宣告它按引用生成時,它才能按引用迭代。

you can only iterate a generator by-reference if it declared that it yields by-reference 

//生成器+引用  呼叫生成器引用類

trycatch(throwable $e)

//這是生成器應用類

<?php

namespace sdk;

class gencite

}public function yieldgencite()

}}

這是程式返回結果:

這是迭代器+引用的效果:2

這是迭代器+引用的效果:1

這是迭代器+引用的效果:0

函式與生成器

一 函式屬性 函式可以在內部建立預設的屬性,還可以在外部通過句點屬性識別符號來動態建立該函式的屬性。def foo foo properly created doc string def bar pass foo.doc foo properly created doc string bar.doc...

函式與生成器

一 函式 1.1 函式的關鍵字 def 定義函式 return 返回值 pass 佔位 exit 1 直接退出並返回1 1.2 高階函式 高階函式都是可以通過 邏輯實現,但是自己寫的函式的複雜程度或者演算法不一定有人家內建的好 map高階函式 def f x return x x print map...

生成器 PHP的生成器yield 原創

在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...