更新到PHP 7吧

PHP 7已經(jīng)發(fā)布了不短的時間河质,也是PHP社區(qū)10多年來最激動人心的更新洒闸。新的引擎Zend Engine 3的“賣點(diǎn)”中最重要的就是性能、速度的提升碌上。盡管引入了一些向后不兼容的更改倚评,但是絕逼值得我們升級浦徊。

2016年7月10日(就在今天),官方的PHP5.5.X的版本前面就開始有一個“Old”開頭了天梧,按計劃今年8月28日盔性,5.6.X也不再更新了。

盡管有一些breaking changes呢岗,但是從5.5冕香、5.6升到7,仍要比5.2升到5.3容易的多。熟悉PHP的開發(fā)者都知道為什么PHP會直接從v5跳到v7后豫,v6想加入原生的Unicode支持暂筝,其實還有5.3就有的Closures以及Namespace等的特性,但是大約5年的時間最后都沒有完成硬贯。最終標(biāo)榜性能的分支phpng以PHP 7的身份公布于眾焕襟。

下面我要給大家列一下PHP有哪些更新:

移除了不再建議使用的特性:

這些特性在使用的時候如果開啟的錯誤級別較高的話,會觸發(fā)E_DEPRECATED錯誤饭豹,PHP7將大量的特性直接移除不再能使用鸵赖。

  • 請更新邏輯和頁面混合的老頁面,移除不兼容的東西拄衰。

    //PHP script tags
    <script language='php'>
        // code
    </script>
    
    //PHP ASP tags
    <%
    // code
    %>
    Short tags
    <%=$str; %>
    

    這些都不再支持它褪,都改成<?php,<?=?>

  • 更新POSIX-Compatible Regular Expressions
    移除ereg拓展,移除下面的函數(shù)
    ereg(),eregi(),ereg_replace(),eregi_replace(),split(),spliti(),sql_regcase().

  • 移除多個switch語句中default cases翘悉,之前的PHP是允許聲明多個default cases茫打,并且只有最后一個case執(zhí)行。

    switch($me) {
        default:
            echo 'ngshell';
            break;
        default:  // only this execute
            echo 'Yap';
            break;
    }
    
  • 移除了ext/mysql拓展妖混,也就是說mysql_開頭的函數(shù)都不再可用老赤。你可以用ext/mysqli替換,當(dāng)然支持用PDO制市。它們都支持prepared statements和調(diào)用stored procedures, 并且最重要的是支持sql占位符抬旺,更容易預(yù)防sql注入,更加安全祥楣。

一致變量語法

這個特性是針對構(gòu)建復(fù)雜動態(tài)的表達(dá)式的時候如何解析所提出來的开财。

  • 類似$$ng['shell'] 該表達(dá)式改如何解析呢?
Expr PHP5 PHP7
$$ng['shell'] ${$ng['shell']} ($$ng)['shell']
$ng->$shell['ngshell'] $ng->{$shell['ngshell']} ($ng->$shell)['ngshell']
$ng->$shell['ngshell']() $ng->{$shell['ngshell']}() ($ng->$shell)['ngshell']()
NgClass::$shell['ngshell'] NgClass::{$shell['ngshell']} (NgClass::$shell)['ngshell']
  • Dereferencing任何有效的表達(dá)式
// access a array key
(expression)['ngshell']
// access a property
(expression)->ngshell
// call a method
(expression)->ngshell()
// access a static property
(expression)::$ngshell
// call a static property
(expression)::ngshell()
// call a callable
(expression)()
// access a char
(expression){0}

// dereferencing scalars
['classname', 'staticMethod']()
[$ngshellObj, "method"]()
'className'::staticMethod();

這些新的魔法的引進(jìn)可能引發(fā)老代碼很難調(diào)試的bug, 但是隨著PHP7的普及误褪,老的责鳍、寫法不規(guī)范的會大量減少。

基本語言的改變

  • 空組合操作符 ??
// PHP 7 before
$ngshell = isset($_GET['ngshell']) ? $_GET['ngshell'] : 'shell';
// PHP 7
$ngshell = $_GET['ngshell'] ?? 'shell';
// fall-through 
$ngshell = $_GET['ngshell'] ?? $_GET['shell'] ?? 'shell';
  • 聯(lián)合比較操作符 (宇宙飛船操作符)
//PHP中第一個3位操作符兽间。
// not return true or false, but -1, 0 or 1
// PHP 7 before
function sort_by_ngshell($a_shell, $b_shell) {
  return ($a_shell < $b_shell) ? -1 : (($a_shell > $b_shell) ? 1 : 0)
}
// PHP 7
function sort_by_ngshell($a_shell, $b_shell) {
  return $a_shell <=> $b_shell;
}
  • 常量數(shù)組
define('shells', ['bash', 'fish', 'ksh', 'csh', 'zsh']);
echo shells[0];

const ngshell = ['ngshell'];
echo ngshell[0];
  • list() 解包實現(xiàn)ArrayAccess接口的對象
$array_like_obj = new ArrayObject(['bash', 'ngshell']);
list(, $ngshell) = $array_like_obj;
echo $ngshell;
  • 新的函數(shù)
// intdiv()
var_dump(intdiv(3, 2));
//preg_replace_callback_array()
$bad_name = 'Ng-shell';
$new = preg_replace_callback_array(
    [   
        '/^(\w+)-/' => function($matches) { return strtolower($matches[0]); },
        '/-/' => function($matches) { return ''; },
    ], 
    $bad_name
);
echo $new;
// random_bytes() 和 random_int()
random_bytes(16)
random_int(0, 123456)
  • 舊函數(shù)的改變
// session_start()
session_start([
    'use_strict' => true;
    'lazy_write' => false;
])
//加強(qiáng)安全的unserialize()
//dirname()
$path = '/shell/ngshell';
echo dirname($path, 2); // path: /
// password_hash() function deprecate salt parameter.

更可控的assertions

  1. 斷言開啟 2.斷言關(guān)閉历葛,可執(zhí)行 3. 斷言不回被編譯0耗性能

更新了異常和錯誤的集成結(jié)構(gòu) 加入了Throwable, 越來越像java。

Unicode 增強(qiáng)

PHP6夭折渡八,不能說明php不支持unicode啃洋。

需要安裝int擴(kuò)展。

echo IntlChar::charName("\u{2603}");

Closure 增強(qiáng)

5.3開始支持Closure屎鳍,5.4支持提前綁定$this, 引進(jìn)實例方法Closure->bindTo()和靜態(tài)方法Closure::bind() 兩個方法其實是一樣的宏娄,只是調(diào)用方式不一樣。第二個方法很重要因為我們能動態(tài)改變Closure域逮壁。PHP7引進(jìn)了實例方法Closure->call()孵坚,了解javascript的同學(xué)很容易理解。如下:

class Ngshell {
  private $version = '0.0.1';
}

$bindGeter = function($that) {
  echo $that . ':' . $this->version;
};

$ngshell = new Ngshell();

$bindGeter->call($ngshell, 'NGSHELL');
// NGSHELL:0.0.1

Generator 增強(qiáng)

Generator是在PHP5.5的時候引入的窥淆,也是我特別喜歡的一個特性卖宠。面試的時候發(fā)現(xiàn)居然好多人都沒聽過 : )
PHP7支持return語句,并且可以用Generator->getReturn()方法得到該值忧饭。還有支持Generator生成其他Generator扛伍。

面向?qū)ο蟮囊恍┳兏?/h4>

不建議使用PHP4的構(gòu)造函數(shù),未來會徹底移除。

  • Group use聲明語句
use Ngshell\Router;
use Ngshell\ORM;
use Ngshell\View;

use Ngshell\{
  Router,
  ORM,
  View,
  function ngshell,
  const NGSHELL
};
  • 支持匿名class
$ngObject = new class($args) extends Ng implements Shell {
  use Ngshell;
}

類型提示

PHP7最動人的一點(diǎn)無疑是標(biāo)量類型提示,當(dāng)然類型提示還包括return類型词裤,嚴(yán)格類型等刺洒。

  • 5.0 class/interface 類型提示
  • 5.1 array 類型提示
  • 5.4 callback 類型提示
  • 7.0 bool, float, int, string
function ngshell(bool $b, float $f, int $i, string $s) {
  // code
}
  • 類型強(qiáng)制
function setHeader(int $statusCode, string $message) {
  header('HTTP/1.1 ' . $statusCode . ' ' . $message);
}
setHeader(404, 'Not Found');
setHeader('200', 'OK'); // '200' 強(qiáng)制為 200
setHeader(502.98, 'Bad Gateway'); // 強(qiáng)制為 502,隨在此處合理吼砂,但證明了類型強(qiáng)制會失去精度逆航。

//嚴(yán)格類型模式
declare(strict_types=1) 
namespace Ngshell\StrictTypes;
setHeader(502.98, 'Bad Gateway'); // 拋出\TypeError 異常
  • 返回值類型提示
function add(int $a, int $b): int {
  return $a + $b;
}

結(jié)束語

目前7.1都已經(jīng)出了,大家趕緊升級吧渔肩!期待PHP發(fā)展越來越好因俐,期待著PHP陣營加入更多的開發(fā)者。有好的社區(qū)才有好的未來周偎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抹剩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蓉坎,更是在濱河造成了極大的恐慌吧兔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袍嬉,死亡現(xiàn)場離奇詭異境蔼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伺通,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門箍土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罐监,你說我怎么就攤上這事吴藻。” “怎么了弓柱?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵沟堡,是天一觀的道長侧但。 經(jīng)常有香客問我,道長航罗,這世上最難降的妖魔是什么禀横? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮粥血,結(jié)果婚禮上栋盹,老公的妹妹穿的比我還像新娘兰粉。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布妓灌。 她就那樣靜靜地躺著痛侍,像睡著了一般蚜枢。 火紅的嫁衣襯著肌膚如雪皆刺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天耕突,我揣著相機(jī)與錄音饶氏,去河邊找鬼。 笑死有勾,一個胖子當(dāng)著我的面吹牛疹启,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔼卡,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼喊崖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雇逞?” 一聲冷哼從身側(cè)響起荤懂,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塘砸,沒想到半個月后节仿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掉蔬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年廊宪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女轿。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡箭启,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛉迹,到底是詐尸還是另有隱情傅寡,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站荐操,受9級特大地震影響芜抒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜托启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一宅倒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驾中,春花似錦、人聲如沸模聋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽链方。三九已至持痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祟蚀,已是汗流浹背工窍。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留前酿,地道東北人患雏。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像罢维,于是被迫代替她去往敵國和親淹仑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容