您好,登錄后才能下訂單哦!
php7的新特性有哪些?針對這個問題,這篇文章給出了相對應的分析和解答,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。
強制模式
declare(strict_types=1) <?php // 強制模式 function sum(int ...$ints) { return array_sum($ints); } print(sum(2, '3', 4.1)); ?> 以上程序執行輸出結果為: 9復制代碼
嚴格模式
<?php declare(strict_types=1); function sum(int ...$ints) { return array_sum($ints); } print(sum(2, '3', 4.1)); ?> 以上程序由于采用了嚴格模式,所以如果參數中出現不適整數的類型會報錯,執行輸出結果為: PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……復制代碼
以前的三元運算
$site = isset($_GET['site']) ? $_GET['site'] : '菜鳥教程';復制代碼
現在的合并運算符
$site = $_GET['site'] ?? '菜鳥教程';復制代碼
以上2種方法是一樣的
以下是實例:
<?php // 獲取 $_GET['site'] 的值,如果不存在返回 '高壓鍋'$site = $_GET['site'] ?? '高壓鍋';print($site);print(PHP_EOL); // PHP_EOL 為換行符 // 以上代碼等價于$site = isset($_GET['site']) ? $_GET['site'] : '高壓鍋';print($site);print(PHP_EOL); // ?? 鏈$site = $_GET['site'] ?? $_POST['site'] ?? '高壓鍋';print($site); ?>復制代碼
PHP 7 新增加的太空船運算符(組合比較符)用于比較兩個表達式 $a 和 $b,如果 $a 小于、等于或大于 $b時,它分別返回-1、0或1。
以下是實例
<?php // 整型比較print( 1 <=> 1);print(PHP_EOL);print( 1 <=> 2);print(PHP_EOL);print( 2 <=> 1);print(PHP_EOL);print(PHP_EOL); // PHP_EOL 為換行符 // 浮點型比較print( 1.5 <=> 1.5);print(PHP_EOL);print( 1.5 <=> 2.5);print(PHP_EOL);print( 2.5 <=> 1.5);print(PHP_EOL);print(PHP_EOL); // 字符串比較print( "a" <=> "a");print(PHP_EOL);print( "a" <=> "b");print(PHP_EOL);print( "b" <=> "a");print(PHP_EOL); ?>復制代碼
以上結果分別為復制代碼
0 -1 1 0 -1 1 0 -1 1復制代碼
以下是實例:
// 使用 define 函數來定義數組 define('sites', [ 'Google', 'Runoob', 'Taobao']);print(sites[1]); ?> 以上程序執行輸出結果為: Runoob復制代碼
<?php 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; // 使用 new class 創建匿名類 $app->setLogger(new class implements Logger { public function log(string $msg) { print($msg); } }); $app->getLogger()->log("我的第一條日志"); ?> 以上程序執行輸出結果為: 我的第一條日志復制代碼
Closure::call()
有著更好的性能,將一個閉包函數動態綁定到一個新的對象實例并調用執行該函數。實例 <?php class A { private $x = 1; } // PHP 7 之前版本定義閉包函數代碼 $getXCB = function() { return $this->x; }; // 閉包函數綁定到類 A 上 $getX = $getXCB->bindTo(new A, 'A'); echo $getX(); print(PHP_EOL); // PHP 7+ 代碼 $getX = function() { return $this->x; }; echo $getX->call(new A); ?> 以上程序執行輸出結果為: 1 1復制代碼
unserialize()
提供過濾的特性,可以防止非法數據進行代碼注入,提供了更安全的反序列化數據。實例 <?php class MyClass1 { public $obj1prop; } class MyClass2 { public $obj2prop; } $obj1 = new MyClass1(); $obj1->obj1prop = 1; $obj2 = new MyClass2(); $obj2->obj2prop = 2; $serializedObj1 = serialize($obj1); $serializedObj2 = serialize($obj2); // 默認行為是接收所有類 // 第二個參數可以忽略 // 如果 allowed_classes 設置為 false, unserialize 會將所有對象轉換為 __PHP_Incomplete_Class 對象 $data = unserialize($serializedObj1 , ["allowed_classes" => true]); // 轉換所有對象到 __PHP_Incomplete_Class 對象,除了 MyClass1 和 MyClass2 $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]); print($data->obj1prop); print(PHP_EOL); print($data2->obj2prop); ?> 以上程序執行輸出結果為: 1 2復制代碼
注意 以上特性是
unserialize()
里面多了一個參數選擇 allowed_classes
CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,偽隨機數產生器)。
PHP 7 通過引入幾個 CSPRNG 函數提供一種簡單的機制來生成密碼學上強壯的隨機數。
random_bytes() - 加密生存被保護的偽隨機字符串。
random_int() - 加密生存被保護的偽隨機整數。
綜上 類似于原先的 rand()
和 'mt_rand()'; 只不過 現在random_bytes()生成的是隨機字符串
assert()
函數。它能在生產環境中實現零成本的斷言,并且提供拋出自定義異常及錯誤的能力。assert()的應用 跟assert_option() 配合復制代碼
還有參數類型
配置項 | 默認值 | 可選值 |
---|---|---|
zend.assertions | 1 | 1.生成和執行代碼 (開發模式) 0.生成代碼,但在執行時跳過它 -1.不生成代碼 (生產環境) |
assert.exception | 0 | 1.斷言失敗時拋出,可以拋出異常對象,如果沒有提供異常,則拋出AssertionError 對象實例。 0 . 使用或生成 Throwable, 僅僅是基于對象生成的警告而不是拋出對象(與 PHP 5 兼容) |
**參數** assertion 斷言。在 PHP 5 中,是一個用于執行的字符串或者用于測試的布爾值。在 PHP 7 中,可以是一個返回任何值的表達式, 它將被執行結果用于指明斷言是否成功。 description 如果 assertion 失敗了,選項 description 將會包括在失敗信息里。 exception 在 PHP 7 中,第二個參數可以是一個 Throwable 對象,而不是一個字符串,如果斷言失敗且啟用了 assert.exception 該對象將被拋出 實例 將 zend.assertions 設置為 0: 實例 <?php ini_set('zend.assertions', 0); assert(true == false); echo 'Hi!'; ?> 以上程序執行輸出結果為: Hi! 將 zend.assertions 設置為 1,assert.exception 設置為 1: 實例 <?php ini_set('zend.assertions', 1); ini_set('assert.exception', 1); assert(true == false); echo 'Hi!'; ?> 以上程序執行輸出結果為: Fatal error: Uncaught AssertionError: assert(true == false) in -:2 Stack trace:#0 -(2): assert(false, 'assert(true == ...')#1 {main} thrown in - on line 2復制代碼
// PHP 7 之前版本需要使用多次 use 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; // PHP 7+ 之后版本可以使用一個 use 導入同一個 namespace 的類 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}; ?>復制代碼
關于php7的新特性就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。