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
- 斷言開啟 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ū)才有好的未來周偎。