本篇文章給大家帶來的內容是關於PHP7.0和php7.1中的文法新特性的總結,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。
php7.0的新特性:
1、空合并運算子(??)
簡化判斷
$param = $_GET['param'] ?? 1;
相當於:
$param = isset($_GET['param']) ? $_GET['param'] : 1;
2、變數型別宣告
兩種模式 : 強制 ( 預設 ) 和 strict 模式
類型:string、int、float和 bool
function add(int $a) { return 1+$a; } var_dump(add(2);
3、傳回值型別宣告
函數和匿名函數都可以指定傳回值的類型
function show(): array { return [1,2,3,4]; }function arraysSum(array ...$arrays): array {return array_map(function(array $array): int {return array_sum($array);}, $arrays);}
4、太空船操作符(組合比較符)
太空船操作符用於比較兩個運算式。當 a大於、等於或小於 b 時它分別返回 -1 、 0 或 1 。 比較的原則是沿用 PHP 的常規比較規則進行的。
// Integersecho 1 <=> 1; // 0echo 1 <=> 2; // -1echo 2 <=> 1; // 1// Floatsecho 1.5 <=> 1.5; // 0echo 1.5 <=> 2.5; // -1echo 2.5 <=> 1.5; // 1// Stringsecho "a" <=> "a"; // 0echo "a" <=> "b"; // -1echo "b" <=> "a"; // 1
5、匿名類
現在支援通過 new class 來執行個體化一個匿名類,這可以用來替代一些“用後即焚”的完整類定義。
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());
6、Unicode codepoint 轉譯文法
這接受一個以16進位形式的 Unicode codepoint,並列印出一個雙引號或heredoc包圍的 UTF-8 編碼格式的字串。 可以接受任何有效 codepoint,並且開頭的 0 是可以省略的。
echo "\u{9876}"
舊版輸出:\u{9876}
新版輸入:頂
7、Closure::call()
Closure::call() 現在有著更好的效能,簡短幹練的暫時綁定一個方法到對象上閉包並調用它。
class Test { public $name = "lixuan";}//PHP7和PHP5.6都可以$getNameFunc = function () { return $this->name;};$name = $getNameFunc->bindTo(new Test, 'Test');echo $name();//PHP7可以,PHP5.6報錯$getX = function () { return $this->name;};echo $getX->call(new Test);
8、為unserialize()提供過濾
這個特性旨在提供更安全的方式解包不可靠的資料。它通過白名單的方式來防止潛在的代碼注入。
//將所有對象分為__PHP_Incomplete_Class對象$data = unserialize($foo, ["allowed_classes" => false]);//將所有對象分為__PHP_Incomplete_Class 對象 除了ClassName1和ClassName2$data = unserialize($foo, ["allowed_classes" => ["ClassName1", "ClassName2"]);//預設行為,和 unserialize($foo)相同$data = unserialize($foo, ["allowed_classes" => true]);
9、IntlChar
新增加的 IntlChar 類旨在暴露出更多的 ICU 功能。這個類自身定義了許多靜態方法用於操作多字元集的 unicode 字元。Intl是Pecl擴充,使用前需要編譯進PHP中,也可apt-get/yum/port install php5-intl
printf('%x', IntlChar::CODEPOINT_MAX);echo IntlChar::charName('@');var_dump(IntlChar::ispunct('!'));
以上常式會輸出:
10ffff
COMMERCIAL AT
bool(true)
10、預期
預期是向後兼用並增強之前的 assert() 的方法。 它使得在生產環境中啟用斷言為零成本,並且提供當宣告失敗時拋出特定異常的能力。 老版本的API出於相容目的將繼續被維護,assert()現在是一個語言結構,它允許第一個參數是一個運算式,而不僅僅是一個待計算的 string或一個待測試的boolean。
ini_set('assert.exception', 1);class CustomError extends AssertionError {}assert(false, new CustomError('Some error message'));
以上常式會輸出:
Fatal error: Uncaught CustomError: Some error message
11、Group use declarations
從同一 namespace 匯入的類、函數和常量現在可以通過單個 use 語句 一次性匯入了。
//PHP7之前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;// PHP7之後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};
12、intp()
接收兩個參數作為被除數和除數,返回他們相除結果的整數部分。
var_dump(intp(7, 2));
輸出int(3)
13、CSPRNG
新增兩個函數: random_bytes() and random_int().可以加密的生產被保護的整數和字串。總之隨機數變得安全了。
random_bytes — 加密生存被保護的偽隨機字串
random_int —加密生存被保護的偽隨機整數
14、preg_replace_callback_array()
新增了一個函數preg_replace_callback_array(),使用該函數可以使得在使用preg_replace_callback()函數時代碼變得更加優雅。在PHP7之前,回呼函數會調用每一個Regex,回呼函數在部分分支上是被汙染了。
15、Session options
現在,session_start()函數可以接收一個數組作為參數,可以覆蓋php.ini中session的配置項。
比如,把cache_limiter設定為私人的,同時在閱讀完session後立即關閉。
session_start(['cache_limiter' => 'private', 'read_and_close' => true,]);
16、產生器的傳回值
在PHP5.5引入產生器的概念。產生器函數每執行一次就得到一個yield標識的值。在PHP7中,當產生器迭代完成後,可以擷取該產生器函數的傳回值。通過Generator::getReturn()得到。
function generator() { yield 1; yield 2; yield 3; return "a";}$generatorClass = ("generator")();foreach ($generatorClass as $val) { echo $val ." ";}echo $generatorClass->getReturn();
輸出為:1 2 3 a
17、產生器中引入其他產生器
在產生器中可以引入另一個或幾個產生器,只需要寫yield from functionName1
function generator1() { yield 1; yield 2; yield from generator2(); yield from generator3();}function generator2() { yield 3; yield 4;}function generator3() { yield 5; yield 6;}foreach (generator1() as $val) { echo $val, " ";}
輸出:1 2 3 4 5 6
18、通過define()定義常量數組
define('ANIMALS', ['dog', 'cat', 'bird']);echo ANIMALS[1]; // outputs "cat"
php7.1的新特性:
1、可為空白(Nullable)類型
類型現在允許為空白,當啟用這個特性時,傳入的參數或者函數返回的結果要麼是給定的類型,要麼是 null 。可以通過在類型前面加上一個問號來使之成為可為空白的。
function test(?string $name) { var_dump($name);}
以上常式會輸出:
string(5) "tpunt"NULLUncaught Error: Too few arguments to function test(), 0 passed in...
2、Void 函數
在PHP 7 中引入的其他傳回值類型的基礎上,一個新的傳回值類型void被引入。 傳回值聲明為 void 類型的方法要麼乾脆省去 return 語句,要麼使用一個空的 return 語句。 對於 void 函數來說,null 不是一個合法的傳回值。
function swap(&$left, &$right) : void { if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp;}$a = 1;$b = 2;var_dump(swap($a, $b), $a, $b);
以上常式會輸出:
nullint(2)int(1)
試圖去擷取一個 void 方法的傳回值會得到 null ,並且不會產生任何警告。這麼做的原因是不想影響更高層次的方法。
3、短數組文法 Symmetric array destructuring
短數組文法([])現在可以用於將數組的值賦給一些變數(包括在foreach中)。 這種方式使從數組中提取值變得更為容易。
$data = [ ['id' => 1, 'name' => 'Tom'], ['id' => 2, 'name' => 'Fred'],];while (['id' => $id, 'name' => $name] = $data) { // logic here with $id and $name}
4、類常量可見度
現在起支援設定類常量的可見度。
class ConstDemo{ const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4;}
5、iterable 偽類
現在引入了一個新的被稱為iterable的偽類 (與callable類似)。 這可以被用在參數或者傳回值類型中,它代表接受數組或者實現了Traversable介面的對象。 至於子類,當用作參數時,子類可以收緊父類的iterable類型到array 或一個實現了Traversable的對象。對於傳回值,子類可以拓寬父類的 array或對象傳回值類型到iterable。
function iterator(iterable $iter) { foreach ($iter as $val) { // }}
6、多異常捕獲處理
一個catch語句塊現在可以通過管道字元(|)來實現多個異常的捕獲。 這對於需要同時處理來自不同類的不同異常時很有用。
try { // some code} catch (FirstException | SecondException $e) { // handle first and second exceptions} catch (\Exception $e) { // ...}
7、list()現在支援鍵名
現在list()支援在它內部去指定鍵名。這意味著它可以將任意類型的數組 都賦值給一些變數(與短數組文法類似)
$data = [ ['id' => 1, 'name' => 'Tom'], ['id' => 2, 'name' => 'Fred'],];while (list('id' => $id, 'name' => $name) = $data) { // logic here with $id and $name}
8、支援為負的字串位移量
現在所有接位移量的內建的基於字串的函數都支援接受負數作為位移量,包括數組解引用操作符([]).
var_dump("abcdef"[-2]);var_dump(strpos("aabbcc", "b", -3));
以上常式會輸出:
string (1) "e"int(3)
9、ext/openssl 支援 AEAD
通過給openssl_encrypt()和openssl_decrypt() 添加額外參數,現在支援了AEAD (模式 GCM and CCM)。
通過 Closure::fromCallable() 將callables轉為閉包
Closure新增了一個靜態方法,用於將callable快速地 轉為一個Closure 對象。
class Test { public function exposeFunction() { return Closure::fromCallable([$this, 'privateFunction']); } private function privateFunction($param) { var_dump($param); }}$privFunc = (new Test)->exposeFunction();$privFunc('some value');
以上常式會輸出:
string(10) "some value"
10、非同步訊號處理 Asynchronous signal handling
A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead).
增加了一個新函數 pcntl_async_signals()來處理非同步訊號,不需要再使用ticks(它會增加佔用資源)
pcntl_async_signals(true); // turn on async signalspcntl_signal(SIGHUP, function($sig) { echo "SIGHUP\n";});posix_kill(posix_getpid(), SIGHUP);
以上常式會輸出:
SIGHUP
11、HTTP/2 伺服器推送支援 ext/curl
Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied.
翻譯:
對於伺服器推送支援添加到curl擴充(需要7.46及以上版本)。
可以通過用新的CURLMOPT_PUSHFUNCTION常量 讓curl_multi_setopt()函數使用。
也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批准或拒絕 伺服器推送回調的執行