解析PHP 5.5 新特性
更新時(shí)間:2013年07月02日 10:30:05 作者:
本篇文章是對(duì)PHP 5.5 的新特性進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
PHP5.5 前不久前剛剛發(fā)布,里面的新特性有什么?官方文檔在這里:
http://www.php.net/manual/zh/migration55.new-features.php
1 生成器 yield關(guān)鍵字
yield的中文文檔在這里:http://php.net/manual/zh/language.generators.overview.php
查看文檔,能知道yield的一個(gè)功能就是能有效的降低迭代的內(nèi)存開(kāi)銷(xiāo)。比如官網(wǎng)的這個(gè)xrange例子:
<?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è)迭代的中間過(guò)程,即每個(gè)中間變量都有個(gè)內(nèi)存空間,那么首先程序使用的內(nèi)存空間就大了,而且分配內(nèi)存,回收內(nèi)存都會(huì)導(dǎo)致程序的運(yùn)行時(shí)間加長(zhǎng)。但是如果使用上yield實(shí)現(xiàn)的xrange函數(shù)的話,里面所有的中間變量都只使用一個(gè)內(nèi)存$i,這樣節(jié)省的時(shí)間和空間都會(huì)變小。
那么為什么yield會(huì)有這樣的效果呢?聯(lián)想到lua中的yield,這里就算是協(xié)程的概念了。在lua語(yǔ)言中,當(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記錄的上下文。這樣形成了程序語(yǔ)言級(jí)別的多協(xié)程操作。php 5.5這里的yield也是同樣的道理,當(dāng)程序運(yùn)行到y(tǒng)ield的時(shí)候,當(dāng)前程序就喚起協(xié)程記錄上下文,然后主函數(shù)繼續(xù)操作,只是php中沒(méi)有使用如resume一樣的關(guān)鍵字,而是“在使用的時(shí)候喚起”協(xié)程。比如上例中的foreach迭代器就能喚起yield。所以上面的這個(gè)例子就能理解了。
其實(shí)照著引用yield來(lái)說(shuō),好多內(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()
對(duì)于“數(shù)組的數(shù)組”進(jìn)行迭代,之前需要使用兩個(gè)foreach,現(xiàn)在只需要使用foreach + list了,但是這個(gè)數(shù)組的數(shù)組中的每個(gè)數(shù)組的個(gè)數(shù)需要一樣。看文檔的例子一看就明白了。
<?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)在可以了
<?php
function foo(){
return false;
}
if(empty(foo())){
echo 11;
} else {
echo 12;
}
5 非變量array和string也能支持下標(biāo)獲取了
<?php
echo array(1, 2, 3)[0];
echo [1, 2, 3][0];
echo "foobar"[2];
?>
6 類(lèi)名通過(guò)::class可以獲取
<?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)。
http://www.php.net/manual/zh/migration55.new-features.php
1 生成器 yield關(guān)鍵字
yield的中文文檔在這里:http://php.net/manual/zh/language.generators.overview.php
查看文檔,能知道yield的一個(gè)功能就是能有效的降低迭代的內(nèi)存開(kāi)銷(xiāo)。比如官網(wǎng)的這個(gè)xrange例子:
復(fù)制代碼 代碼如下:
<?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è)迭代的中間過(guò)程,即每個(gè)中間變量都有個(gè)內(nèi)存空間,那么首先程序使用的內(nèi)存空間就大了,而且分配內(nèi)存,回收內(nèi)存都會(huì)導(dǎo)致程序的運(yùn)行時(shí)間加長(zhǎng)。但是如果使用上yield實(shí)現(xiàn)的xrange函數(shù)的話,里面所有的中間變量都只使用一個(gè)內(nèi)存$i,這樣節(jié)省的時(shí)間和空間都會(huì)變小。
那么為什么yield會(huì)有這樣的效果呢?聯(lián)想到lua中的yield,這里就算是協(xié)程的概念了。在lua語(yǔ)言中,當(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記錄的上下文。這樣形成了程序語(yǔ)言級(jí)別的多協(xié)程操作。php 5.5這里的yield也是同樣的道理,當(dāng)程序運(yùn)行到y(tǒng)ield的時(shí)候,當(dāng)前程序就喚起協(xié)程記錄上下文,然后主函數(shù)繼續(xù)操作,只是php中沒(méi)有使用如resume一樣的關(guān)鍵字,而是“在使用的時(shí)候喚起”協(xié)程。比如上例中的foreach迭代器就能喚起yield。所以上面的這個(gè)例子就能理解了。
其實(shí)照著引用yield來(lái)說(shuō),好多內(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()
對(duì)于“數(shù)組的數(shù)組”進(jìn)行迭代,之前需要使用兩個(gè)foreach,現(xiàn)在只需要使用foreach + list了,但是這個(gè)數(shù)組的數(shù)組中的每個(gè)數(shù)組的個(gè)數(shù)需要一樣。看文檔的例子一看就明白了。
復(fù)制代碼 代碼如下:
<?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)在可以了
復(fù)制代碼 代碼如下:
<?php
function foo(){
return false;
}
if(empty(foo())){
echo 11;
} else {
echo 12;
}
5 非變量array和string也能支持下標(biāo)獲取了
復(fù)制代碼 代碼如下:
<?php
echo array(1, 2, 3)[0];
echo [1, 2, 3][0];
echo "foobar"[2];
?>
6 類(lèi)名通過(guò)::class可以獲取
復(fù)制代碼 代碼如下:
<?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)。
相關(guān)文章
PHP自帶函數(shù)給數(shù)字或字符串自動(dòng)補(bǔ)齊位數(shù)
很多時(shí)候我們需要對(duì)數(shù)字進(jìn)行格式化,比如位數(shù)不足前面加0補(bǔ)足。用 php可以很輕易實(shí)現(xiàn),因?yàn)镻HP自帶了相關(guān)功能的函數(shù)。2014-07-07
PHP 自定義錯(cuò)誤處理函數(shù)trigger_error()
trigger_error() 用于在用戶指定的條件下觸發(fā)一個(gè)錯(cuò)誤消息。它與內(nèi)建的錯(cuò)誤處理器一同使用,也可以與由 set_error_handler() 函數(shù)創(chuàng)建的用戶自定義函數(shù)使用2013-03-03
phpMyAdmin 鏈接表的附加功能尚未激活的問(wèn)題
安裝了phpMyAdmin之后一直有這個(gè)問(wèn)題。雖然知道自己可能用不到這些功能,但是不解決這個(gè)問(wèn)題總覺(jué)著phpMyAdmin和MySQL的安裝沒(méi)有成功。2010-08-08
php 靜態(tài)屬性和靜態(tài)方法區(qū)別詳解
這篇文章主要介紹了php 靜態(tài)屬性和靜態(tài)方法區(qū)別詳解,需要的朋友可以參考下2017-04-04
php開(kāi)發(fā)時(shí)容易忘記的一些技術(shù)細(xì)節(jié)
本文給大家分享的是在使用PHP做開(kāi)發(fā)的時(shí)候,比較容易忽視的2個(gè)小細(xì)節(jié),分別是empty和in_array,有需要的小伙伴可以來(lái)參考下。2016-02-02

