yield的中文文檔在這裏:http://php.net/manual/zh/language.generators.overview.phpphp
查看文檔,能知道yield的一個功能就是能有效的下降迭代的內存開銷。好比官網的這個xrange例子:java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
function
xrange(
$start
,
$limit
,
$step
= 1) {
for
(
$i
=
$start
;
$i
<=
$limit
;
$i
+=
$step
) {
yield
$i
;
}
}
echo
'Single digit odd numbers: '
;
/*
* Note that an array is never created or returned,
* which saves memory.
*/
foreach
(xrange(1, 9, 2)
as
$number
) {
echo
"$number "
;
}
echo
"\n"
;
?>
|
這裏的xrange是一個迭代,功能和range是同樣的,若是使用range函數的話,那麼函數內部實現會儲存每一個迭代的中間過程,即每一箇中間變量都有個內存空間,那麼首先程序使用的內存空間就大了,並且分配內存,回收內存都會致使程序的運行時間加長。可是若是使用上yield實現的xrange函數的話,裏面全部的中間變量都只使用一個內存$i,這樣節省的時間和空間都會變小。git
那麼爲何yield會有這樣的效果呢?聯想到lua中的yield,這裏就算是協程的概念了。在lua語言中,當程序運行到yield的時候,使用協程將上下文環境記錄住,而後將程序操做權歸還到主函數,當主函數調用resume的時候,會從新喚起協程,讀取yield記錄的上下文。這樣造成了程序語言級別的多協程操做。php 5.5這裏的yield也是一樣的道理,當程序運行到yield的時候,當前程序就喚起協程記錄上下文,而後主函數繼續操做,只是php中沒有使用如resume同樣的關鍵字,而是「在使用的時候喚起」協程。好比上例中的foreach迭代器就能喚起yield。因此上面的這個例子就能理解了。web
其實照着引用yield來講,好多內部函數,特別是迭代有關的函數應該都有可能進行優化。或許後續會有yield版本和非yield版本的實現同一功能的函數把。apache
這個和java中的finally同樣,經典的try ... catch ... finally 三段式異常處理。windows
對於「數組的數組」進行迭代,以前須要使用兩個foreach,如今只須要使用foreach + list了,可是這個數組的數組中的每一個數組的個數須要同樣。看文檔的例子一看就明白了。數組
1
2
3
4
5
6
7
8
9
10
|
<?php
$array
= [
[1, 2],
[3, 4],
];
foreach
(
$array
as
list(
$a
,
$b
)) {
echo
"A: $a; B: $b\n"
;
}
?>
|
以前empty()中的參數是不能爲函數的。如今能夠了函數
1
2
3
4
5
6
7
8
9
10
|
<?php
function
foo(){
return
false;
}
if
(
empty
(foo())){
echo
11;
}
else
{
echo
12;
}
|
1
2
3
4
5
6
7
8
|
<?php
echo
array
(1, 2, 3)[0];
echo
[1, 2, 3][0];
echo
"foobar"
[2];
?>
|
1
2
3
4
5
6
7
8
|
<?php
namespace
Name\Space;
class
ClassName {}
echo
ClassName::
class
;
echo
"\n"
;
?>
|
使用opcache會提升php的性能,你能夠和其餘擴展同樣靜態編譯(--enable-opcache)或者動態擴展(zend_extension)加入這個優化項。性能
A 新的密碼哈希 API that makes it easier to securely hash and manage passwords using the same underlying library ascrypt() in PHP has been added. See the documentation for password_hash() for more detail.優化
對 GD 擴展作了多方面的改進,包括: