php7.0的新特性:
1、空合并運算符(??)
簡化判斷
$param = $_GET[ param ] ?? 1;
相當于:
$param = isset($_GET[ param ]) ? $_GET[ param ] : 1;
2、變量類型聲明
兩種模式 : 強制 ( 默認 ) 和 嚴格模式
類型:string、int、float和 bool
function add(int $a) { return 1+$a; var_dump(add(2);
3、返回值類型聲明
函數和匿名函數都可以指定返回值的類型
function show(): array { return [1,2,3,4]; function arraysSum(array ...$arrays): array {return array_map(function(array $array): int {return array_sum($array);}, $arrays);}
4、太空船操作符(組合比較符)
太空船操作符用于比較兩個表達式。當 a大于、等于或小于 b 時它分別返回 -1 、 0 或 1 。 比較的原則是沿用 PHP 的常規比較規則進行的。
// Integersecho 1 = // 0echo 1 = // -1echo 2 = // 1// Floatsecho 1.5 = 1.5; // 0echo 1.5 = 2.5; // -1echo 2.5 = 1.5; // 1// Stringsecho a = a // 0echo a = b // -1echo b = a // 1
5、匿名類
現在支持通過 new html' target='_blank'>class 來實例化一個匿名類,這可以用來替代一些“用后即焚”的完整類定義。
interface Logger { public function log(string $msg);class Application { private $logger; public function getLogger(): Logger { return $this- logger; public function setLogger(Logger $logger) { $this- logger = $logger;$app = new Application;$app- setLogger(new class implements Logger { public function log(string $msg) { echo $msg;var_dump($app- getLogger());
6、Unicode codepoint 轉譯語法
這接受一個以16進制形式的 Unicode codepoint,并打印出一個雙引號或heredoc包圍的 UTF-8 編碼格式的字符串。 可以接受任何有效的 codepoint,并且開頭的 0 是可以省略的。
echo /u{9876}
舊版輸出:/u{9876}
新版輸入:頂
7、Closure::call()
Closure::call() 現在有著更好的性能,簡短干練的暫時綁定一個方法到對象上閉包并調用它。
class Test { public $name = lixuan //PHP7和PHP5.6都可以$getNameFunc = function () { return $this- name;$name = $getNameFunc- bindTo(new Test, Test echo $name();//PHP7可以,PHP5.6報錯$getX = function () { return $this- name;echo $getX- call(new Test);
8、為unserialize()提供過濾
這個特性旨在提供更安全的方式解包不可靠的數據。它通過白名單的方式來防止潛在的代碼注入。
//將所有對象分為__PHP_Incomplete_Class對象$data = unserialize($foo, [ allowed_classes = false]);//將所有對象分為__PHP_Incomplete_Class 對象 除了ClassName1和ClassName2$data = unserialize($foo, [ allowed_classes = [ ClassName1 , ClassName2 ]);//默認行為,和 unserialize($foo)相同$data = unserialize($foo, [ allowed_classes = true]);
9、IntlChar
新增加的 IntlChar 類旨在暴露出更多的 ICU 功能。這個類自身定義了許多靜態方法用于操作多字符集的 unicode 字符。Intl是Pecl擴展,使用前需要編譯進PHP中,也可apt-get/yum/port install php5-intl
printf( %x , IntlChar::CODEPOINT_MAX);echo IntlChar::charName( @ var_dump(IntlChar::ispunct( !
以上例程會輸出:
10ffff
COMMERCIAL AT
bool(true)
10、預期
預期是向后兼用并增強之前的 assert() 的方法。 它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。 老版本的API出于兼容目的將繼續被維護,assert()現在是一個語言結構,它允許第一個參數是一個表達式,而不僅僅是一個待計算的 string或一個待測試的boolean。
ini_set( assert.exception , 1);class CustomError extends AssertionError {}assert(false, new CustomError( Some error message
以上例程會輸出:
Fatal error: Uncaught CustomError: Some error message
11、Group use declarations
從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了。
//PHP7之前use some/namespace/ClassA;use some/namespace/ClassB;use some/namespace/ClassC as C;use function some/namespace/fn_a;use function some/namespace/fn_b;use function some/namespace/fn_c;use const some/namespace/ConstA;use const some/namespace/ConstB;use const some/namespace/ConstC;// PHP7之后use some/namespace/{ClassA, ClassB, ClassC as C};use function some/namespace/{fn_a, fn_b, fn_c};use const some/namespace/{ConstA, ConstB, ConstC};
12、intp()
接收兩個參數作為被除數和除數,返回他們相除結果的整數部分。
var_dump(intp(7, 2));
輸出int(3)
13、CSPRNG
新增兩個函數: random_bytes() and random_int().可以加密的生產被保護的整數和字符串??傊S機數變得安全了。
random_bytes — 加密生存被保護的偽隨機字符串
random_int —加密生存被保護的偽隨機整數
14、preg_replace_callback_array()
新增了一個函數preg_replace_callback_array(),使用該函數可以使得在使用preg_replace_callback()函數時代碼變得更加優雅。在PHP7之前,回調函數會調用每一個正則表達式,回調函數在部分分支上是被污染了。
15、Session options
現在,session_start()函數可以接收一個數組作為參數,可以覆蓋php.ini中session的配置項。
比如,把cache_limiter設置為私有的,同時在閱讀完session后立即關閉。
session_start([ cache_limiter = private , read_and_close = true,]);
16、生成器的返回值
在PHP5.5引入生成器的概念。生成器函數每執行一次就得到一個yield標識的值。在PHP7中,當生成器迭代完成后,可以獲取該生成器函數的返回值。通過Generator::getReturn()得到。
function generator() { yield 1; yield 2; yield 3; return a $generatorClass = ( generator )();foreach ($generatorClass as $val) { echo $val . echo $generatorClass- getReturn();
輸出為:1 2 3 a
17、生成器中引入其他生成器
在生成器中可以引入另一個或幾個生成器,只需要寫yield from functionName1
function generator1() { yield 1; yield 2; yield from generator2(); yield from generator3();function generator2() { yield 3; yield 4;function generator3() { yield 5; yield 6;foreach (generator1() as $val) { echo $val, }
輸出:1 2 3 4 5 6
18、通過define()定義常量數組
define( ANIMALS , [ dog , cat , bird echo ANIMALS[1]; // outputs cat
php7.1的新特性:
1、可為空(Nullable)類型
類型現在允許為空,當啟用這個特性時,傳入的參數或者函數返回的結果要么是給定的類型,要么是 null ??梢酝ㄟ^在類型前面加上一個問號來使之成為可為空的。
function test(?string $name) { var_dump($name);}
以上例程會輸出:
string(5) tpunt Uncaught Error: Too few arguments to function test(), 0 passed in...
2、Void 函數
在PHP 7 中引入的其他返回值類型的基礎上,一個新的返回值類型void被引入。 返回值聲明為 void 類型的方法要么干脆省去 return 語句,要么使用一個空的 return 語句。 對于 void 函數來說,null 不是一個合法的返回值。
function swap( $left, $right) : void { if ($left === $right) { return; $tmp = $left; $left = $right; $right = $tmp;$a = 1;$b = 2;var_dump(swap($a, $b), $a, $b);
以上例程會輸出:
nullint(2)int(1)
試圖去獲取一個 void 方法的返回值會得到 null ,并且不會產生任何警告。這么做的原因是不想影響更高層次的方法。
3、短數組語法 Symmetric array destructuring
短數組語法([])現在可以用于將數組的值賦給一些變量(包括在foreach中)。 這種方式使從數組中提取值變得更為容易。
$data = [ [ id = 1, name = Tom ], [ id = 2, name = Fred ],while ([ id = $id, name = $name] = $data) { // logic here with $id and $name}
4、類常量可見性
現在起支持設置類常量的可見性。
class ConstDemo const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4;}
5、iterable 偽類
現在引入了一個新的被稱為iterable的偽類 (與callable類似)。 這可以被用在參數或者返回值類型中,它代表接受數組或者實現了Traversable接口的對象。 至于子類,當用作參數時,子類可以收緊父類的iterable類型到array 或一個實現了Traversable的對象。對于返回值,子類可以拓寬父類的 array或對象返回值類型到iterable。
function iterator(iterable $iter) { foreach ($iter as $val) {}
6、多異常捕獲處理
一個catch語句塊現在可以通過管道字符(|)來實現多個異常的捕獲。 這對于需要同時處理來自不同類的不同異常時很有用。
try { // some code} catch (FirstException | SecondException $e) { // handle first and second exceptions} catch (/Exception $e) { // ...}
7、list()現在支持鍵名
現在list()支持在它內部去指定鍵名。這意味著它可以將任意類型的數組 都賦值給一些變量(與短數組語法類似)
$data = [ [ id = 1, name = Tom ], [ id = 2, name = Fred ],while (list( id = $id, name = $name) = $data) { // logic here with $id and $name}
8、支持為負的字符串偏移量
現在所有接偏移量的內置的基于字符串的函數都支持接受負數作為偏移量,包括數組解引用操作符([]).
var_dump( abcdef [-2]);var_dump(strpos( aabbcc , b , -3));
以上例程會輸出:
string (1) e int(3)
9、ext/openssl 支持 AEAD
通過給openssl_encrypt()和openssl_decrypt() 添加額外參數,現在支持了AEAD (模式 GCM and CCM)。
通過 Closure::fromCallable() 將callables轉為閉包
Closure新增了一個靜態方法,用于將callable快速地 轉為一個Closure 對象。
class Test { public function exposeFunction() { return Closure::fromCallable([$this, privateFunction private function privateFunction($param) { var_dump($param);$privFunc = (new Test)- exposeFunction();$privFunc( some value
以上例程會輸出:
string(10) some value
10、異步信號處理 Asynchronous signal handling
A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead).
增加了一個新函數 pcntl_async_signals()來處理異步信號,不需要再使用ticks(它會增加占用資源)
pcntl_async_signals(true); // turn on async signalspcntl_signal(SIGHUP, function($sig) { echo SIGHUP/n posix_kill(posix_getpid(), SIGHUP);
以上例程會輸出:
SIGHUP
11、HTTP/2 服務器推送支持 ext/curl
Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied.
翻譯:
對于服務器推送支持添加到curl擴展(需要7.46及以上版本)。
可以通過用新的CURLMOPT_PUSHFUNCTION常量 讓curl_multi_setopt()函數使用。
也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批準或拒絕 服務器推送回調的執行
相關文章推薦:
php7和php5有什么不同之處?php5與php7之間的對比
PHP新特性:finally關鍵字的用法
以上就是PHP7.0和php7.1中的語法新特性的總結的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答