天天看点

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)加入这个优化项。