成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PHP7新特性的介紹

klivitamJ / 1858人閱讀

摘要:截止到目前為止,官方已經(jīng)發(fā)布了的版本,距離發(fā)布第一個(gè)正式版本不會(huì)很遠(yuǎn)了現(xiàn)在來(lái)說(shuō)的重大特性肯定已經(jīng)是定型了,不會(huì)再有什么變動(dòng)了。

截止到目前為止,PHP官方已經(jīng)發(fā)布了php7的RC7版本,距離發(fā)布第一個(gè)正式版本不會(huì)很遠(yuǎn)了!現(xiàn)在來(lái)說(shuō)php7的重大特性肯定已經(jīng)是定型了,不會(huì)再有什么變動(dòng)了。后續(xù)一些版本的迭代主要也就是修修bug,優(yōu)化之類(lèi)的。下面就來(lái)說(shuō)話(huà)我們一直期待的php7會(huì)有那些主要的變化了。。。

關(guān)于PHP

20年的發(fā)展歷史;

迄今為止最流行的WEB開(kāi)發(fā)語(yǔ)言;

超過(guò)82%的網(wǎng)站都會(huì)使用PHP作為他們的服務(wù)端開(kāi)發(fā)語(yǔ)言;

新特性介紹

PHP NG – Zend Engine 3

抽象語(yǔ)法樹(shù)

64位的 INT 支持

統(tǒng)一的變量語(yǔ)法

新增Closure::call()

一致性foreach循環(huán)

匿名類(lèi)的支持

新增 <=>**、?? 、u{xxxx}操作符

增加了返回類(lèi)型的聲明

增加了標(biāo)量類(lèi)型的聲明

核心錯(cuò)誤可以通過(guò)異常捕獲

增加了上下文敏感的詞法分析

PHP NG

ZVAL

大小從24字節(jié)減少到16字節(jié)

Zend Array(HashTable)

HashTable大小從72字節(jié)減少到56字節(jié)
HashTable bucket大小從72字節(jié)減少到32字節(jié)

函數(shù)調(diào)用的優(yōu)化

使用了新的內(nèi)存分配,管理方式,減少了內(nèi)存的浪費(fèi)

Immutable array optimization

$arr = [];

for($i=0; $i<100000; $i++) {
    $arr[] = ["php"];
}

p(memory_get_usage(true));

PHP5: 45M
PHP7: 10M

一些非常常用,開(kāi)銷(xiāo)不大的的函數(shù)直接變成了引擎支持的opcode

call_user_function(_array) => ZEND_INIT_USER_CALL
is_int、is_string、is_array、... => ZEND_TYPE_CHECK
strlen => ZEND_STRLEN
defined => ZEND+DEFINED

核心排序的優(yōu)化

PHP5(zend_qsort
快速排序(非穩(wěn)定排序)

array(1 => 0, 0 => 0)

PHP7(zend_sort
快速排序+選擇排序(穩(wěn)定排序)

array(0 => 0, 1 => 0)

小于16個(gè)元素的使用選擇排序,大于16個(gè)按照16個(gè)為單位去分割,分別使用選擇排序,然后再全部合起來(lái)使用快速排序。排序較之前相比,內(nèi)部元素由非穩(wěn)定排序變成穩(wěn)定排序,減少元素的交換次數(shù),減少對(duì)內(nèi)存的操作次數(shù),性能提升40%

抽象語(yǔ)法樹(shù)

假如現(xiàn)在我們有這樣的需求,要對(duì)php源文件就行語(yǔ)法檢測(cè),實(shí)現(xiàn)編碼規(guī)范。php5之前的話(huà),沒(méi)有AST,直接從parser就生成了opcodes!就需要借助一些外部的php語(yǔ)法解析器來(lái)實(shí)現(xiàn);而php7增加了AST,我們可以自己去實(shí)現(xiàn)這樣一個(gè)擴(kuò)展,利用擴(kuò)展提供的函數(shù)可以直接獲取文件對(duì)應(yīng)的的AST結(jié)構(gòu),而這樣的結(jié)構(gòu)正是我們可以識(shí)別的,所以就可以在這個(gè)基礎(chǔ)上去做一些優(yōu)化和判斷了。

64位的INT支持

支持存儲(chǔ)大于2GB的字符串

支持上傳大小大于2GB的文件

保證字符串在所有平臺(tái)上【64位】都是64bit

統(tǒng)一的語(yǔ)法變量
$$foo["bar"]["baz"] 

PHP5: ${$foo[‘bar’]["baz"]}
PHP7: ($$foo)[‘bar’][‘baz"]【從左至右法則】

(function() {})();
$foo()();
[$obj, "method"]();

class A {
    public static function a1() {}
}

[new A, "a1"]();
新增Closure::call()
$f = function() {
    p($this->name);
};

class F {
    private $name = "F";
}

$f->call(new F);
匿名類(lèi)的支持
function getAnonymousClass($config) {
    return new class(config) {};
 }

p(getAnonymousClass(array()));
一致性的foreach循環(huán)
//PHP5
$a =  array(1, 2, 3);foreach ($a as $v){var_dump(current($a));}
int(2)
int(2)
int(2)

$a =  array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)

$a =  array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)

//PHP7:不再操作數(shù)據(jù)的內(nèi)部指針了
$a =  array(1, 2, 3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

$a =  array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)

$a =  array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)
新增的幾個(gè)操作符

<=>

//PHP5
function compare($a, $b) {
    return ($a < $b) ? -1 : (($a >$b) ? 1 : 0);
}
//PHP7
function compare($a, $b) {
    return $a <=> $b;
}

**

2 ** 2; // 2 * 2 = 4
2 ** -1; // 1 / 2 = 0.5
3 ** -2; // 1 / 9 = 0.111111111

??

$a = null;
$b = 1;
$c = 2;
echo $a ?? $b , ‘,’ , $c ?? $b; // 1,2
echo $a ?? $b ?? $c  , ‘,’ , $a ?? $d ?? $c; // 1,2

u{xxxx}

echo "u{4f60}";//你
echo "u{65b0}";//新
// 從右至左強(qiáng)制
echo"u{202E}iabgnayu{1F602}";;
? yangbai
返回類(lèi)型的聲明
function getInt() : int {
    return "test";
}; 

getInt();

//返回值為DateTime的函數(shù)
function getDateTime() : DateTime {
    return new DateTime();
}; 
標(biāo)量類(lèi)型的聲明
function getAmount(int $num) : int {
    return $num;
}; 

getAmount("test");

//PHP5
#PHP Catchable fatal error:  Argument 1 passed to getInt() must be an instance of int, string given…

//PHP7
#Fatal error: Uncaught TypeError: Argument 1 passed to getInt() must be of the type integer, string given…

getAmount("123");
#PHP7新增的嚴(yán)格模式選項(xiàng)開(kāi)啟下也會(huì)報(bào)錯(cuò)【declare(strict_types=1),注意要放到代碼的第一行】
核心錯(cuò)誤可以通過(guò)異常捕獲了
try {
    non_exists_func();
} catch(EngineException $e) {
    echo "Exception: {$e->getMessage();}
";
} finally {
    echo "undefined function…";
}

//這里用php7試了一下沒(méi)有捕獲成功【但是確實(shí)拋出了異常】。。。
#Exception: Call to undefined function non_exists_func()
上下問(wèn)敏感的詞法分析
//PHP5
class Collection {public function foreach($arr) {}}
#Parse error:  parse error, expecting `"identifier (T_STRING)”’...

//PHP7
class Collection {
    public function foreach($arr) {
        return $this;
    }
    public function in($arr){
        return $this;
    }
    public function sort($condition){
        return $this;
    }
    public function echo($condition){
        return "ok";
    }
}
$collection = new Collection();
$collection->in()->foreach()->sort()->echo();
打破的一些東西

mysql、ereg

mysql 移到了 ext/pecl 中去了,ereg 移到了 ext/pcre

isapi、tux etc SAPIs

?

HTTP_RAW_POST_DATA移除了(可以使用php://input替代)

$o = & new className(),不再支持這樣的寫(xiě)法

mktime()、gmmktime() 函數(shù)的$is_dst 參數(shù)被移除了

setlocale()函數(shù)的$category參數(shù)不支持字符串了,必須是LC開(kāi)頭的常量

php.ini文件移除了#作為注釋?zhuān)y(tǒng)一用;去注釋

函數(shù)定義同名參數(shù)不支持了

類(lèi)的同名構(gòu)造函數(shù)不推薦(目前沒(méi)有移除,后續(xù)會(huì)去掉)

String,int,float等這些關(guān)鍵字不能被作為類(lèi)、接口、trait的名稱(chēng)使用了

func_get_arg/func_get_args獲取的是當(dāng)前變量的值

無(wú)效的八進(jìn)制數(shù)字會(huì)產(chǎn)生編譯錯(cuò)誤

preg_replace()不再支持匹配模式/e

16進(jìn)制的字符串?dāng)?shù)字轉(zhuǎn)換被移除了

不再支持靜態(tài)調(diào)用一個(gè)不兼容的$this上下文的非靜態(tài)調(diào)用

Unsafe curl file uploads (use CurlFile instead)

//PHP5
curl_setopt(ch, CURLOPT_POSTFIELDS, array(
    "file" => "@".realpath("image.png"), 
)); 

//PHP7
curl_setopt(ch, CURLOPT_POSTFIELDS, [
    "file" => new CURLFile(realpath("image.png")), 
]); 

一些移除的函數(shù)和選項(xiàng)

set_magic_quotes_runtime();
magic_quotes_runtime();

//(use stream_set_blocking() instead)
set_socket_blocking();

//(use mcrypt_generic_deinit() instead)
mcrypt_generic_end();

//(use mcrypt_encrypt() and mcrypt_decrypt() instead)
mcrypt_ecb();
mcrypt_cbc();
mcrypt_cfb();
mcrypt_ofb();

//(use datefmt_set_timezone() or IntlDateFormatter::setTimeZone() instead)
datefmt_set_timezone_id();
IntlDateFormatter::setTimeZoneID();

//(use XsltProcessor::setSecurityPrefs() instead)
xsl.security_prefs;//php.ini 

//(use php.input_encoding、php.internal_encoding and php.output_encoding instead)
iconv.input_encoding;
iconv.output_encoding;
iconv.internal_encoding;
mbstring.http_input;
mbstring.http_output;
mbstring.internal_encoding;

(use PDO::ATTR_EMULATE_PREPARES instead)
PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT;//driver option 
 
//(use peer_name instead)
CN_match;//SSL context options 
SNI_server_name;//SSL context options 

差不多了,夜已深、人已困!
更多、更詳細(xì)的介紹請(qǐng)猛戳 這里

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21175.html

相關(guān)文章

  • PHP7源碼分析】PHP7到底有多快,基準(zhǔn)測(cè)試與特性分析告訴你

    摘要:我們修改上面代碼,再來(lái)看下返回值類(lèi)型限制的情況運(yùn)行結(jié)果這段代碼我們額外聲明了返回值的類(lèi)型為型。對(duì)函數(shù)返回值的聲明做了擴(kuò)充,可以定義其返回值為,無(wú)論是否開(kāi)啟嚴(yán)格模式,只要函數(shù)中有以外的其他語(yǔ)句都會(huì)報(bào)錯(cuò)。 順風(fēng)車(chē)運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 王坤 發(fā)表至21CTO公眾號(hào)(https://mp.weixin.qq.com/s/ph...) showImg(https://segmentfault.c...

    Towers 評(píng)論0 收藏0
  • PHP7特性介紹

    摘要:本文內(nèi)容根據(jù)發(fā)布時(shí)的而來(lái),鏈接地址特性一覽新的操作符之前的寫(xiě)法比較兩個(gè)數(shù)的大小新增的操作符可以直接使用這種方式輸出字符這個(gè)是方括號(hào)里面的問(wèn)號(hào),因?yàn)槭亲址?,博客不支持,發(fā)布出來(lái)新增的一個(gè)函數(shù),具體功能沒(méi)有深入研究變量類(lèi)型聲明與之相關(guān)的一個(gè)語(yǔ) 本文內(nèi)容根據(jù)PHP發(fā)布時(shí)的 new files 而來(lái),鏈接地址 : PHP 7 new 特性一覽 Added ?? operator Adde...

    icyfire 評(píng)論0 收藏0
  • 【天贏金創(chuàng)】PHP7與Swoole

    摘要:但在密集計(jì)算方面比等靜態(tài)編譯語(yǔ)言差幾十倍甚至上百倍。一使用棧內(nèi)存在引擎和擴(kuò)展中,經(jīng)常要?jiǎng)?chuàng)建一個(gè)的變量,底層就是一個(gè)指針。代碼中創(chuàng)建的變量也進(jìn)行了優(yōu)化,直接在棧內(nèi)存上預(yù)分配。應(yīng)用層與底層在錯(cuò)誤拋出的方式全部統(tǒng)一為異常。 原文:http://rango.swoole.com/archives/440最近PHP官方終于發(fā)布了傳說(shuō)中的PHP7,雖然只是alpha版。PHP7號(hào)稱(chēng)是新一代的PHP...

    MingjunYang 評(píng)論0 收藏0
  • PHP7.1_特性

    摘要:性能優(yōu)化使用棧內(nèi)存在引擎和擴(kuò)展中,經(jīng)常要?jiǎng)?chuàng)建一個(gè)變量,底層就是一個(gè)指針。而可以直接使用棧內(nèi)存作用節(jié)省一次內(nèi)存分配和管理存儲(chǔ)值,查詢(xún)不需要重復(fù)計(jì)算為字符串單獨(dú)創(chuàng)建了新類(lèi)型叫做,除了指針和長(zhǎng)度之外,增加了一個(gè)字段,用于保存字符串的值。 變量類(lèi)型 PHP7版本函數(shù)的參數(shù)和返回值增加了類(lèi)型限定。原因:為了PHP7.1版本JIT特性做準(zhǔn)備,增加類(lèi)型之后PHP, JIT可以準(zhǔn)確判斷變量類(lèi)型,生成最...

    xiao7cn 評(píng)論0 收藏0
  • PHP7特性

    摘要:主要的變化有以下幾點(diǎn)抽象語(yǔ)法樹(shù)在之前的版本中,代碼在語(yǔ)法解析階段直接生成了指令,也就是在中直接生成指令,這使得編譯器與執(zhí)行器耦合在一起。 PHP7 從發(fā)布到現(xiàn)在已經(jīng)有快三年的時(shí)間了,現(xiàn)在已經(jīng)發(fā)展到 PHP7.2.9 版本了。它的發(fā)布給 PHP 帶來(lái)了很大的性能提升,這主要是得益于 PHP 對(duì) Zend 引擎的深度優(yōu)化,同時(shí)還降低了 PHP 對(duì)系統(tǒng)的資源占用。 主要的變化有以下幾點(diǎn): 抽...

    Honwhy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<