首頁 >後端開發 >PHP7 >一起看看php7新特性

一起看看php7新特性

coldplay.xixi
coldplay.xixi轉載
2020-06-22 17:42:463504瀏覽

一起看看php7新特性

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)
  ecb704628f0d1ba7498867870ef3bec0

以上程序执行输出结果为:

9复制代码
  • 嚴格模式

43ec82d44a534e8fd5e8416c4719c4dd
以上程序由于采用了严格模式,所以如果参数中出现不适整数的类型会报错,执行输出结果为:

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種方法是一樣的

  • 以下是實例:

    937b551757918eaa8d4bc2575cf4f5cc复制代码

組合比較符,又稱為太空船運算子

PHP 7 新增加的太空船運算子(組合比較符)用於比較兩個表達式$a 和$b,如果$a 小於、等於或大於$b時,它分別傳回-1、0或1。

以下是實例

838d2955445a31c5bbdfb717d04cb05d 1);print(PHP_EOL);print( 1 96b4fef55684b9312718d5de63fb7121 2);print(PHP_EOL);print( 2 96b4fef55684b9312718d5de63fb7121 1);print(PHP_EOL);print(PHP_EOL); // PHP_EOL 为换行符

// 浮点型比较print( 1.5 96b4fef55684b9312718d5de63fb7121 1.5);print(PHP_EOL);print( 1.5 96b4fef55684b9312718d5de63fb7121 2.5);print(PHP_EOL);print( 2.5 96b4fef55684b9312718d5de63fb7121 1.5);print(PHP_EOL);print(PHP_EOL);

// 字符串比较print( "a" 96b4fef55684b9312718d5de63fb7121 "a");print(PHP_EOL);print( "a" 96b4fef55684b9312718d5de63fb7121 "b");print(PHP_EOL);print( "b" 96b4fef55684b9312718d5de63fb7121 "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 來實例化一個匿名類,這可以用來取代一些」用後即焚"的完整類別定義。

  • 以下是實例:

        f59462b884d1e29413c7c5dcd5e665d5logger; 
           } 
        
           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() 有著更好的效能,將一個閉包函數動態綁定到一個新的物件實例並呼叫執行該函數。

实例
c887e2e2c47091b63aac6293b2ac837dx; 
}; 

// 闭包函数绑定到类 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() 配合复制代码

還有參數類型

##01.斷言失敗時拋出,可以拋出異常對象,如果沒有提供異常,則拋出AssertionError 對象實例。
**参数**
assertion
断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。
description
如果 assertion 失败了,选项 description 将会包括在失败信息里。
exception
在 PHP 7 中,第二个参数可以是一个 Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出

实例
将 zend.assertions 设置为 0:
实例
<?php 
ini_set(&#39;zend.assertions&#39;, 0); 

assert(true == false); 
echo &#39;Hi!&#39;; 
?>
以上程序执行输出结果为:
Hi!
将 zend.assertions 设置为 1,assert.exception 设置为 1:
实例
<?php 
ini_set(&#39;zend.assertions&#39;, 1); 
ini_set(&#39;assert.exception&#39;, 1); 

assert(true == false); 
echo &#39;Hi!&#39;; 
?>
以上程序执行输出结果为:
Fatal error: Uncaught AssertionError: assert(true == false) in -:2
Stack trace:#0 -(2): assert(false, &#39;assert(true == ...&#39;)#1 {main}
  thrown in - on line 2复制代码

PHP 7 use 语句

  • PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量:

// 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}; 
?>

推荐教程:《php教程

#設定項目 預設值 #可選值
zend.assertions #1 1.產生與執行程式碼(開發模式)
0.產生程式碼,但在執行時跳過它
-1.不產生程式碼(生產環境)
#assert.exception0 . 使用或產生 Throwable, 只是基於物件產生的警告而不是拋出物件(與 PHP 5 相容)

以上是一起看看php7新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除