一起看看php7新特性

2020-07-16 10:06:16

1、PHP 標量型別與返回值型別宣告

2、PHP NULL 合併運算子

3、PHP 太空船運算子(組合比較符)

4、PHP 常數陣列

5、PHP 匿名類

6、PHP Closure::call()

7、PHP 過濾 unserialize()

8、PHP IntlChar()

9、PHP CSPRNG

10、PHP 7 異常

11、PHP 7 use 語句

12、PHP 7 錯誤處理

13、PHP intp() 函數

14、PHP 7 Session 選項

15、PHP 7 廢棄特性

16、PHP 7 移除的擴充套件

17、PHP 7 移除的 SAPI

PHP 標量型別與返回值型別宣告

  • 標量型別宣告

    強制模式

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……複製程式碼

PHP NULL 合併運算子

  • 以前的三元運算

  $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複製程式碼

PHP 常數陣列

  • 以前定義常數陣列 只能有 const;

  • 現在定義常數陣列可以使用 define();

以下是範例:

// 使用 define 函數來定義陣列
define('sites', [   'Google',   'Runoob',   'Taobao']);print(sites[1]);
?>
以上程式執行輸出結果為:

Runoob複製程式碼

PHP 匿名類

  • PHP 7 支援通過 new class 來範例化一個匿名類,這可以用來替代一些"用後即焚"的完整類定義。

  • 以下是範例:

        <?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("我的第一條紀錄檔"); 
        ?>
以上程式執行輸出結果為:

我的第一條紀錄檔複製程式碼

php Closure::call()

  • PHP 7 的 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複製程式碼

PHP 過濾 unserialize()

  • PHP 7 增加了可以為 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

PHP CSPRNG 偽亂數生成器

  • CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,偽亂數產生器)。

  • PHP 7 通過引入幾個 CSPRNG 函數提供一種簡單的機制來生成密碼學上強壯的亂數。

random_bytes() - 加密生存被保護的偽隨機字串。

random_int() - 加密生存被保護的偽隨機整數。

  • 綜上 類似於原先的 rand() 和 'mt_rand()'; 只不過 現在random_bytes()生成的是隨機字串

php7 異常

  • PHP 7 異常用於向下相容及增強舊的assert()函數。它能在生產環境中實現零成本的斷言,並且提供丟擲自定義異常及錯誤的能力。

  • 老版本的API出於相容目的將繼續被維護。

  • assert()現在是一個語言結構,它允許第一個引數是一個表示式,而不僅僅是一個待計算的 string或一個待測試的boolean。

assert()的應用  跟assert_option() 配合複製程式碼

還有引數型別

設定項預設值可選值
zend.assertions11.生成和執行程式碼 (開發模式)
0.生成程式碼,但在執行時跳過它
-1.不生成程式碼 (生產環境)
assert.exception01.斷言失敗時丟擲,可以丟擲異常物件,如果沒有提供異常,則丟擲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 語句

  • PHP 7 可以使用一個 use 從同一個 namespace 中匯入類、函數和常數:

// PHP 7 之前版本需要使用多次 use 
use somenamespaceClassA; 
use somenamespaceClassB; 
use somenamespaceClassC as C; 
use function somenamespacefn_a; 
use function somenamespacefn_b; 
use function somenamespacefn_c; 
use const somenamespaceConstA; 
use const somenamespaceConstB; 
use const somenamespaceConstC; 
// PHP 7+ 之後版本可以使用一個 use 匯入同一個 namespace 的類 
use somenamespace{ClassA, ClassB, ClassC as C}; 
use function somenamespace{fn_a, fn_b, fn_c}; 
use const somenamespace{ConstA, ConstB, ConstC}; 
?>

以上就是一起看看php7新特性的詳細內容,更多請關注TW511.COM其它相關文章!