2016-06-15 61 views
7

昨天,我瞭解到PHP有一個yield()方法。我不確定它在PHP中的用處。PHP收益與PDO獲取?

一位同事表示,它可以幫助SQL語句返回許多行,從而導致潛在的內存問題。我相信他是指fetchAll()。 但是,不是使用fetchAll(),也可以使用fetch()並逐行處理行。所以,yield()對於解決他所指的問題並不是關鍵。

我是否錯過yield() vs fetch()?使用yield()和發電機有更多好處嗎?

P.S:這是真的,這是比較容易寫在yield()大型應用程序乾淨,可讀性和maitainable代碼要比用fetch()

+3

嘛,PDO不是產量usefilness一個很好的例子,因爲PDO語句已經實現了一個可遍歷的接口,並且可以使用foreach進行迭代。但是使用mysqli你可以使用yield來使foreq的mysqli結果迭代。 –

+1

那麼,一般來說,這取決於*發生器*的用途(因爲yield是發生器的實現細節)。生成器對於創建行爲類似於數組(或者說是一個* iterable *)的東西很有用,但它不會將其所有數據存儲在內存中,而是根據需要每次迭代生成*它。是的,這可以在獲取數據庫結果的上下文中使用,但也可以用來實現無限計數器或任何其他事物。 – deceze

回答

9

因此,yield()對於解決他所指的問題並不是關鍵。

沒錯。

但它可以讓你僞裝while()/fetch()序列作爲foreach()調用,如果你願意,也沒有內存開銷。

然而,PDO是不是一個很好的例子,因爲PDOStatement已經實現了一個穿越的接口,因此can be iterated over using foreach()

$stmt = $pdo->query('SELECT name FROM users'); 
foreach ($stmt as $row) 
{ 
    var_export($row); 
} 

因此,讓我們的mysqli的例子API只能流導致一個接一個。
編輯。實際上,since 5.4.0 mysqli supports Traversable也是如此,所以在mysqli_result中使用yield也沒有意義。但是,嘿,讓我們保持它的示範目的。

讓我們創建一個這樣

function mysqli_gen (mysqli_result $res) 
{ 
    while($row = mysqli_fetch_assoc($res)) 
    { 
     yield $row; 
    } 
} 

發電機,現在你可以使用的foreach行無開銷:

$res = $mysqli->query("SELECT * FROM users"); 
foreach (mysqli_gen($res) as $row) 
{ 
    var_export($row); 
}