天天看點

PHP 5.5 新特性1 生成器 yield關鍵字2 finally關鍵字3 foreach 支援list()4 empty() 支援自定義函數了5 非變量array和string也能支援下标擷取了6 類名通過::class可以擷取7 增加了opcache擴充

php5.5 前不久前剛剛釋出,裡面的新特性有什麼?官方文檔在這裡:

<a href="http://www.php.net/manual/zh/migration55.new-features.php">http://www.php.net/manual/zh/migration55.new-features.php</a>

yield的中文文檔在這裡:http://php.net/manual/zh/language.generators.overview.php

檢視文檔,能知道yield的一個功能就是能有效的降低疊代的記憶體開銷。比如官網的這個xrange例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>&lt;?php</code>

<code>function</code> <code>xrange(</code><code>$start</code><code>,</code><code>$limit</code><code>,</code><code>$step</code> <code>= 1) {</code>

<code>    </code><code>for</code> <code>(</code><code>$i</code> <code>=</code><code>$start</code><code>;</code><code>$i</code> <code>&lt;=</code><code>$limit</code><code>;</code><code>$i</code> <code>+=</code><code>$step</code><code>) {</code>

<code>        </code><code>yield</code> <code>$i</code><code>;</code>

<code>    </code><code>}</code>

<code>}</code>

<code>echo</code> <code>'single digit odd numbers: '</code><code>;</code>

<code>/*</code>

<code> </code><code>* note that an array is never created or returned,</code>

<code> </code><code>* which saves memory.</code>

<code> </code><code>*/</code>

<code>foreach</code> <code>(xrange(1, 9, 2)</code><code>as</code> <code>$number</code><code>) {</code>

<code>    </code><code>echo</code> <code>"$number "</code><code>;</code>

<code>echo</code> <code>"\n"</code><code>;</code>

<code>?&gt;</code>

這裡的xrange是一個疊代,功能和range是一樣的,如果使用range函數的話,那麼函數内部實作會儲存每個疊代的中間過程,即每個中間變量都有個記憶體空間,那麼首先程式使用的記憶體空間就大了,而且配置設定記憶體,回收記憶體都會導緻程式的運作時間加長。但是如果使用上yield實作的xrange函數的話,裡面所有的中間變量都隻使用一個記憶體$i,這樣節省的時間和空間都會變小。

那麼為什麼yield會有這樣的效果呢?聯想到lua中的yield,這裡就算是協程的概念了。在lua語言中,當程式運作到yield的時候,使用協程将上下文環境記錄住,然後将程式操作權歸還到主函數,當主函數調用resume的時候,會重新喚起協程,讀取yield記錄的上下文。這樣形成了程式語言級别的多協程操作。php 5.5這裡的yield也是同樣的道理,當程式運作到yield的時候,目前程式就喚起協程記錄上下文,然後主函數繼續操作,隻是php中沒有使用如resume一樣的關鍵字,而是“在使用的時候喚起”協程。比如上例中的foreach疊代器就能喚起yield。是以上面的這個例子就能了解了。

其實照着引用yield來說,好多内部函數,特别是疊代有關的函數應該都有可能進行優化。或許後續會有yield版本和非yield版本的實作同一功能的函數把。

這個和java中的finally一樣,經典的try ... catch ... finally 三段式異常處理。

對于“數組的數組”進行疊代,之前需要使用兩個foreach,現在隻需要使用foreach + list了,但是這個數組的數組中的每個數組的個數需要一樣。看文檔的例子一看就明白了。

<code>$array</code> <code>= [</code>

<code>    </code><code>[1, 2],</code>

<code>    </code><code>[3, 4],</code>

<code>];</code>

<code>foreach</code> <code>(</code><code>$array</code> <code>as</code> <code>list(</code><code>$a</code><code>,</code><code>$b</code><code>)) {</code>

<code>    </code><code>echo</code> <code>"a: $a; b: $b\n"</code><code>;</code>

之前empty()中的參數是不能為函數的。現在可以了

<code>function</code> <code>foo(){</code>

<code>    </code><code>return</code> <code>false;</code>

<code>if</code><code>(</code><code>empty</code><code>(foo())){</code>

<code>    </code><code>echo</code> <code>11;</code>

<code>}</code><code>else</code> <code>{</code>

<code>    </code><code>echo</code> <code>12;</code>

<code> </code> 

<code>echo</code> <code>array</code><code>(1, 2, 3)[0];</code>

<code>echo</code> <code>[1, 2, 3][0];</code>

<code>echo</code> <code>"foobar"</code><code>[2];</code>

<code>namespace</code> <code>name\space;</code>

<code>class</code> <code>classname {}</code>

<code>echo</code> <code>classname::</code><code>class</code><code>;</code>

使用opcache會提高php的性能,你可以和其他擴充一樣靜态編譯(--enable-opcache)或者動态擴充(zend_extension)加入這個優化項。