php7新特性

這是一個標題


隨着php7的推出多了不少新特性,接下來我帶你們瞭解下:

H1

H2

H3

一、PHP 標量類型與返回值類型聲明php

二、PHP NULL 合併運算符html

三、PHP 太空船運算符(組合比較符)數組

四、PHP 常量數組安全

五、PHP 匿名類bash

六、PHP Closure::call()markdown

七、PHP 過濾 unserialize()php7

八、PHP IntlChar()閉包

九、PHP CSPRNGapp

十、PHP 7 異常dom

十一、PHP 7 use 語句

十二、PHP 7 錯誤處理

1三、PHP intdiv() 函數

1四、PHP 7 Session 選項

1五、PHP 7 廢棄特性

1六、PHP 7 移除的擴展

1七、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時,它分別返回-一、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.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 語句

  • 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}; 
?>
複製代碼

如下還有幾個特性 不一一註釋 本文主要是用來 加深本身對php7的印象 以及對markdown的熟練使用

本文來源於 www.runoob.com/php/php7-ne…

相關文章
相關標籤/搜索