一、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
強制模式
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時,它分別返回-一、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};
?>
複製代碼