原文地址: [http://php.net/manual/zh/migration70.new-features.php](http://php.net/manual/zh/migration70.new-features.php)
### 新特性
### 標量類型聲明
標量類型聲明 有兩種模式: 強制 (默認) 和 嚴格模式。 現在可以使用下列類型參數(無論用強制模式還是嚴格模式): 字符串(string), 整數 (int), 浮點數 (float), 以及布爾值 (bool)。它們擴充了PHP5中引入的其他類型:類名,接口,數組和 回調類型
~~~
<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));
~~~
以上例程會輸出:
~~~
int(9)
~~~
要使用嚴格模式,一個 declare 聲明指令必須放在文件的頂部。這意味著嚴格聲明標量是基于文件可配的。 這個指令不僅影響參數的類型聲明,也影響到函數的返回值聲明(參見 返回值類型聲明, 內置的PHP函數以及擴展中加載的PHP函數)
完整的標量類型聲明文檔和示例參見類型聲明章節。
### 返回值類型聲明
PHP 7 增加了對返回類型聲明的支持。 類似于參數類型聲明,返回類型聲明指明了函數返回值的類型。可用的類型與參數聲明中可用的類型相同。
~~~
<?php
function arraysSum(array ...$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
~~~
以上例程會輸出:
~~~
Array
(
[0] => 6
[1] => 15
[2] => 24
)
~~~
完整的標量類型聲明文檔和示例可參見 返回值類型聲明.
### null合并運算符
由于日常使用中存在大量同時使用三元表達式和 isset()的情況, 我們添加了null合并運算符 (??) 這個語法糖。如果變量存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個操作數。
~~~
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// Coalesces can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
~~~
### 太空船操作符(組合比較符)
太空船操作符用于比較兩個表達式。當a大于、等于或小于b時它分別返回-1、0或1。 比較的原則是沿用 PHP 的常規比較規則進行的。
~~~
<?php
// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
~~~
### 通過 define() 定義常量數組
Array 類型的常量現在可以通過 definedefine() 來定義。在 PHP5.6 中僅能通過 const 定義。
~~~
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // outputs "cat"
?>
~~~
### 匿名類
現在支持通過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;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
var_dump($app->getLogger());
?>
~~~
以上例程會輸出:
~~~
object(class@anonymous)#2 (0) {
}
~~~
詳細文檔可以參考 匿名類.
### Unicode codepoint 轉譯語法
這接受一個以16進制形式的 Unicode codepoint,并打印出一個雙引號或heredoc包圍的 UTF-8 編碼格式的字符串。 可以接受任何有效的 codepoint,并且開頭的 0 是可以省略的。
~~~
echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";
~~~
以上例程會輸出:
~~~
a
a (same as before but with optional leading 0's)
香
~~~
### Closure::call()
Closure::call() 現在有著更好的性能,簡短干練的暫時綁定一個方法到對象上閉包并調用它。
~~~
<?php
class A {private $x = 1;}
// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();
// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);
~~~
以上例程會輸出:
~~~
1
1
~~~
### 為unserialize()提供過濾
這個特性旨在提供更安全的方式解包不可靠的數據。它通過白名單的方式來防止潛在的代碼注入。
~~~
<?php
// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);
// converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
// default behaviour (same as omitting the second argument) that accepts all classes
$data = unserialize($foo, ["allowed_classes" => true]);
~~~
### IntlChar
新增加的 IntlChar 類旨在暴露出更多的 ICU 功能。這個類自身定義了許多靜態方法用于操作多字符集的 unicode 字符。
~~~
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
~~~
以上例程會輸出:
~~~
10ffff
COMMERCIAL AT
bool(true)
~~~
若要使用此類,請先安裝Intl擴展
### 預期
預期是向后兼用并增強之前的 assert() 的方法。 它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。
老版本的API出于兼容目的將繼續被維護,assert()現在是一個語言結構,它允許第一個參數是一個表達式,而不僅僅是一個待計算的 string或一個待測試的boolean。
~~~
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
?>
~~~
以上例程會輸出:
~~~
Fatal error: Uncaught CustomError: Some error message
~~~
關于這個特性的完整說明,包括如何在開發和生產環境中配置它,可以在assert()的 expectations section章節找到。
### Group use declarations
從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了。
~~~
<?php
// Pre PHP 7 code
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+ code
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};
?>
~~~
### Generator Return Expressions
此功能是建立在引入PHP5.5發電機的功能。它能夠為要在發電機內使用,以便為最終的表達式返回return語句(返回引用是不允許的)。該值可以使用新的發電機:: getReturn()方法,該方法只能使用一次發電機已完成收益值是牽強。
~~~
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
~~~
以上例程會輸出:
~~~
1
2
3
~~~
能夠從發電機明確地返回一個最終值是有一個方便的能力。這是因為它使供到由發電機被返回(從或許某種形式的協程計算),可以通過執行發生器客戶代碼進行具體處理的最終值。這比迫使客戶端代碼首先檢查最終值是否已經產生了,然后如果是這樣,專門負責處理該值簡單。
### Generator delegation
發電機現在可以委托給另一發生器,自動位移對象或數組,而無需使用來自結構屈服編寫樣板在最外面的發電機。
~~~
<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL;
}
?>
~~~
以上例程會輸出:
~~~
1
2
3
4
~~~
### Integer division with intdiv()
新intdiv()函數執行的操作數的整數除法并返回。
~~~
<?php
var_dump(intdiv(10, 3));
?>
~~~
以上例程會輸出:
~~~
int(3)
~~~
### Session options
在session_start()現在接受的選項,覆蓋在php.ini中通常設置會話配置指令的數組。
這些選項也得到了擴展,以支持session.lazy_write,這是在默認情況下并導致PHP只覆蓋任何會話文件,如果會話數據已經改變,read_and_close,這是一個只能傳遞給在session_start()的選項,以表明會話數據應該讀,然后會議應立即關閉不變。
例如,要session.cache_limiter設置為私有,并立即閱讀后關閉會話:
~~~
<?php
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
?>
~~~
### preg_replace_callback_array()
新preg_replace_callback_array()函數使代碼編寫更干凈使用preg_replace_callback()函數時。在此之前PHP7,這需要每個正則表達式執行回調需要回調函數被污染,有很多分支。
現在,回調可以注冊使用一個關聯數組,其中最關鍵的是一個正則表達式的值是一個回調的每個正則表達式。
### CSPRNG Functions
兩個新的功能已被添加到生成加密安全整數和字符串的跨平臺的方式:random_bytes()和random_int()。
### list() can always unpack objects implementing ArrayAccess
此前,列表()是不能保證與實施了ArrayAccess對象的正常運行。這已得到修復。
- 前言
- php編寫RSS源
- PHP編寫rss源(續)
- ubuntu 上給PHP安裝擴展 Msgpack 和 Yar
- PHPCMS廣告模塊詳細分析——廣告的生成
- Yii配合Yar在php5.3.3環境下的錯誤以及解決方案
- 【Yaf】Yaf的環境安裝遇到的問題以及解決方案
- 【PHP擴展】centos給PHP安裝擴展
- 【MYSQL】PHPMYADMIN出現的問題以及解決方案
- 【PHP】阿里云升級PHP到5.5詳解
- 【phpMyAdmin】修改配置文件連接到其他服務器
- 【PHP】PHP5.4.0版本ChangeLog詳解(上)
- 【PHP】編譯安裝 PHP5.6.13遇到問題以及解決方案
- 【翻譯】PHP7——新特性
- 【PHP】數組foreach引發的小問題
- 【CURL】PHP的CURL開發項目最佳實踐
- 【PHP】PHP轉換圖片為ico格式源碼
- 【PHP】PHP圖像裁剪縮略裁切類源代碼及使用方法