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
標量類型宣告
強制模式
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复制代码
先前定義常數數組只能有 const;
現在定義常數數組可以使用define();
以下是實例:
// 使用 define 函数来定义数组 define('sites', [ 'Google', 'Runoob', 'Taobao']);print(sites[1]); ?> 以上程序执行输出结果为: Runoob复制代码
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 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 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
CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,偽隨機數產生器)。
PHP 7 透過引入幾個 CSPRNG 函數提供一個簡單的機制來產生密碼學上強壯的隨機數。
random_bytes() - 加密生存被保護的偽隨機字串。
random_int() - 加密生存被保護的偽隨機整數。
綜上 類似原先的rand()
和 'mt_rand()'; 只不過現在random_bytes()產生的是隨機字串
PHP 7 異常用於向下相容及增強舊的assert()
函數。它能在生產環境中實現零成本的斷言,並且提供拋出自定義異常及錯誤的能力。
舊版的API會因為相容目的而繼續被維護。
assert()現在是一個語言結構,它允許第一個參數是一個表達式,而不僅僅是一個待計算的 string或一個待測試的boolean。
assert()的应用 跟assert_option() 配合复制代码
還有參數類型
#設定項目 | 預設值 | #可選值 |
---|---|---|
zend.assertions | #1 | 1.產生與執行程式碼(開發模式) 0.產生程式碼,但在執行時跳過它 -1.不產生程式碼(生產環境) |
#assert.exception | ##01.斷言失敗時拋出,可以拋出異常對象,如果沒有提供異常,則拋出AssertionError 對象實例。 | 0 . 使用或產生 Throwable, 只是基於物件產生的警告而不是拋出物件(與 PHP 5 相容) |