PHP5.5新特性
1 生成器 yield關(guān)鍵字
yield的中文文檔在這里:http://php.net/manual/zh/language.generators.overview.php
查看文檔,能知道yield的一個(gè)功能就是能有效的降低迭代的內(nèi)存開銷。比如官網(wǎng)的這個(gè)xrange例子:
| 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是一個(gè)迭代,功能和range是一樣的,如果使用range函數(shù)的話,那么函數(shù)內(nèi)部實(shí)現(xiàn)會(huì)儲(chǔ)存每個(gè)迭代的中間過程,即每個(gè)中間變量都有個(gè)內(nèi)存空間,那么首先程序使用的內(nèi)存空間就大了,而且分配內(nèi)存,回收內(nèi)存都會(huì)導(dǎo)致程序的運(yùn)行時(shí)間加長。但是如果使用上yield實(shí)現(xiàn)的xrange函數(shù)的話,里面所有的中間變量都只使用一個(gè)內(nèi)存$i,這樣節(jié)省的時(shí)間和空間都會(huì)變小。
?
那么為什么yield會(huì)有這樣的效果呢?聯(lián)想到lua中的yield,這里就算是協(xié)程的概念了。在lua語言中,當(dāng)程序運(yùn)行到y(tǒng)ield的時(shí)候,使用協(xié)程將上下文環(huán)境記錄住,然后將程序操作權(quán)歸還到主函數(shù),當(dāng)主函數(shù)調(diào)用resume的時(shí)候,會(huì)重新喚起協(xié)程,讀取yield記錄的上下文。這樣形成了程序語言級別的多協(xié)程操作。php 5.5這里的yield也是同樣的道理,當(dāng)程序運(yùn)行到y(tǒng)ield的時(shí)候,當(dāng)前程序就喚起協(xié)程記錄上下文,然后主函數(shù)繼續(xù)操作,只是php中沒有使用如resume一樣的關(guān)鍵字,而是“在使用的時(shí)候喚起”協(xié)程。比如上例中的foreach迭代器就能喚起yield。所以上面的這個(gè)例子就能理解了。
?
其實(shí)照著引用yield來說,好多內(nèi)部函數(shù),特別是迭代有關(guān)的函數(shù)應(yīng)該都有可能進(jìn)行優(yōu)化?;蛟S后續(xù)會(huì)有yield版本和非yield版本的實(shí)現(xiàn)同一功能的函數(shù)把。
2 finally關(guān)鍵字
這個(gè)和java中的finally一樣,經(jīng)典的try ... catch ... finally 三段式異常處理。
3 foreach 支持list()
對于“數(shù)組的數(shù)組”進(jìn)行迭代,之前需要使用兩個(gè)foreach,現(xiàn)在只需要使用foreach + list了,但是這個(gè)數(shù)組的數(shù)組中的每個(gè)數(shù)組的個(gè)數(shù)需要一樣??次臋n的例子一看就明白了。
| 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"; } ?> |
4 empty() 支持自定義函數(shù)了
之前empty()中的參數(shù)是不能為函數(shù)的?,F(xiàn)在可以了
| 1 2 3 4 5 6 7 8 9 10 | <?php function?foo(){ ????return?false; } if(empty(foo())){ ????echo?11; } else?{ ????echo?12; } |
5 非變量array和string也能支持下標(biāo)獲取了
| 1 2 3 4 5 6 7 8 | <?php ?? echo?array(1, 2, 3)[0]; echo?[1, 2, 3][0]; ?? echo?"foobar"[2]; ?? ?> |
6 類名通過::class可以獲取
| 1 2 3 4 5 6 7 8 | <?php namespace?Name\Space; class?ClassName {} echo?ClassName::class; echo?"\n"; ?> |
7 增加了opcache擴(kuò)展
使用opcache會(huì)提高php的性能,你可以和其他擴(kuò)展一樣靜態(tài)編譯(--enable-opcache)或者動(dòng)態(tài)擴(kuò)展(zend_extension)加入這個(gè)優(yōu)化項(xiàng)。
8 ?新的密碼哈希 API
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.
Apache 2.4 handler supported on Windows
The Apache 2.4 handler SAPI is now supported on Windows.
改進(jìn) GD
對 GD 擴(kuò)展做了多方面的改進(jìn),包括:
- 翻轉(zhuǎn)支持使用新的?imageflip()?函數(shù)。
- 高級裁剪支持使用?imagecrop()?&?imagecropauto()?函數(shù)。
- WebP 的讀寫分別支持使用?imagecreatefromwebp()?&?imagewebp()?。
轉(zhuǎn)載于:https://www.cnblogs.com/whoamme/p/3539323.html
總結(jié)
- 上一篇: Newtonsoft.json中 lin
- 下一篇: PHP移动互联网开发笔记(3)——运算符