亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP 7.1中有哪些新的特性

發布時間:2020-12-16 15:25:29 來源:億速云 閱讀:311 作者:Leah 欄目:開發技術

PHP 7.1中有哪些新的特性?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、可空類型

可空類型主要用于參數類型聲明和函數返回值聲明。

主要的兩種形式如下:

<?php
function answer(): ?int {
 return null; //ok
}

function answer(): ?int {
 return 42; // ok
}

function say(?string $msg) {
 if ($msg) {
 echo $msg;
 }
}

從例子很容易理解,所指的就是通過 ? 的形式表明函數參數或者返回值的類型要么為指定類型,要么為 null。

此方法也可用于接口函數的定義:

<?php
interface Fooable {
 function foo(?Fooable $f);
}

但有一個需要注意的地方:如果函數本身定義了參數類型并且沒有默認值,即使是可空的,也不能省略,否則會觸發錯誤。如下:

<?php
function foo_nullable(?Bar $bar) {}

foo_nullable(new Bar); // 可行
foo_nullable(null); // 可行
foo_nullable(); // 不可行

但是如果以上函數的參數定義為 ?Bar $bar = null 的形式,則第三種寫法也是可行的。因為 = null 實際上相當于 ? 的超集,對于可空類型的參數,可以設定 null 為默認值。

二、list 的方括號簡寫

我們知道在 PHP5.4 之前只能通過 array() 來定義數組,5.4之后添加了 [] 的簡化寫法(省略了5個字符還是很實在的)。

<?php
// 5.4 之前
$array = array(1, 2, 3);
$array = array("a" => 1, "b" => 2, "c" => 3);

// 5.4 及之后
$array = [1, 2, 3];
$array = ["a" => 1, "b" => 2, "c" => 3];

引申到另外一個問題上,如果我們要把數組的值賦值給不同的變量,可以通過 list 來實現:

<?php
list($a, $b, $c) = $array;

是否也可以通過 [] 的簡寫來實現呢?

<?php
[$a, $b, $c] = $array;

以及下一個特性中會提到的 list 指定 key

<?php
["a" => $a, "b" => $b, "c" => $c] = $array;

PHP7.1 實現了這個特性。但是要注意的是:出現在左值中的 [] 并不是數組的簡寫,是 list() 的簡寫。

但是并不僅僅如此,新的 list() 的實現并不僅僅可以出現在左值中,也能在 foreach 循環中使用:

<?php
foreach ($points as ["x" => $x, "y" => $y]) {
 var_dump($x, $y);
}

不過因為實現的問題,list() 和 [] 不能相互嵌套使用:

<?php
// 不合法
list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]];

// 不合法
[list($a, $b), list($c, $d)] = [[1, 2], [3, 4]];

// 合法
[[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];

三、允許在 list 中指定 key

上文提到過,新的 list() 的實現中可以指定key:

<?php
$array = ["a" => 1, "b" => 2, "c" => 3];
["a" => $a, "b" => $b, "c" => $c] = $array;

這也就相當于:

<?php
$a = $array['a'];
$b = $array['b'];
$c = $array['c'];

和以往的區別在于以往的 list() 的實現相當于 key 只能是 0, 1, 2, 3 的數字形式并且不能調整順序。執行以下語句:

<?php
list($a, $b) = [1 => '1', 2 => '2'];

會得到 PHP error: Undefined offset: 0... 的錯誤。

而新的實現則可以通過以下方式來調整賦值:

<?php
list(1 => $a, 2 => $b) = [1 => '1', 2 => '2'];

不同于數組的是,list 并不支持混合形式的 key,以下寫法會觸發解析錯誤:

<?php
// Parse error: syntax error, ...
list($unkeyed, "key" => $keyed) = $array;

更復雜的情況,list 也支持復合形式的解析:

<?php
$points = [
 ["x" => 1, "y" => 2],
 ["x" => 2, "y" => 1]
];

list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points;

$points = [
 "first" => [1, 2],
 "second" => [2, 1]
];

list("first" => list($x1, $y1), "second" => list($x2, $y2)) = $points;

以及循環中使用:

<?php
$points = [
 ["x" => 1, "y" => 2],
 ["x" => 2, "y" => 1]
];

foreach ($points as list("x" => $x, "y" => $y)) {
 echo "Point at ($x, $y)", PHP_EOL;
}

四、void 返回類型

PHP7.0 添加了指定函數返回類型的特性,但是返回類型卻不能指定為 void,7.1 的這個特性算是一個補充:

<?php
function should_return_nothing(): void {
 return 1; // Fatal error: A void function must not return a value
}

以下兩種情況都可以通過驗證:

<?php
function lacks_return(): void {
 // valid
}

function returns_nothing(): void {
 return; // valid
}

定義返回類型為 void 的函數不能有返回值,即使返回 null 也不行:

<?php
function returns_one(): void {
 return 1; // Fatal error: A void function must not return a value
}

function returns_null(): void {
 return null; // Fatal error: A void function must not return a value
}

此外 void 也只適用于返回類型,并不能用于參數類型聲明,或者會觸發錯誤:

<?php
function foobar(void $foo) { // Fatal error: void cannot be used as a parameter type
}

類函數中對于返回類型的聲明也不能被子類覆蓋,否則會觸發錯誤:

<?php
class Foo
{
 public function bar(): void {
 }
}

class Foobar extends Foo
{
 public function bar(): array { // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void
 }
}

五、類常量屬性設定

這個特性說起來比較簡單,就是現在類中的常量支持使用 publicprivate protected 修飾了:

<?php
class Token {
 // 常量默認為 public
 const PUBLIC_CONST = 0;

 // 可以自定義常量的可見范圍
 private const PRIVATE_CONST = 0;
 protected const PROTECTED_CONST = 0;
 public const PUBLIC_CONST_TWO = 0;

 // 多個常量同時聲明只能有一個屬性
 private const FOO = 1, BAR = 2;
}

此外,接口(interface)中的常量只能是 public 屬性:

<?php
interface ICache {
 public const PUBLIC = 0;
 const IMPLICIT_PUBLIC = 1;
}

為了應對變化,反射類的實現也相應的豐富了一下,增加了 getReflectionConstant getReflectionConstants 兩個方法用于獲取常量的額外屬性:

<?php
class testClass {
 const TEST_CONST = 'test';
}

$obj = new ReflectionClass( "testClass" );
$const = $obj->getReflectionConstant( "TEST_CONST" );
$consts = $obj->getReflectionConstants();

六、多條件 catch

在以往的 try ... catch 語句中,每個 catch 只能設定一個條件判斷:

<?php
try {
 // Some code...
} catch (ExceptionType1 $e) {
 // 處理 ExceptionType1
} catch (ExceptionType2 $e) {
 // 處理 ExceptionType2
} catch (\Exception $e) {
 // ...
}

新的實現中可以在一個 catch 中設置多個條件,相當于或的形式判斷:

<?php
try {
 // Some code...
} catch (ExceptionType1 | ExceptionType2 $e) {
 // 對于 ExceptionType1 和 ExceptionType2 的處理
} catch (\Exception $e) {
 // ...
}

關于PHP 7.1中有哪些新的特性問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬莱市| 临汾市| 木里| 泗水县| 钟祥市| 全州县| 临漳县| 吉林市| 旌德县| 张家口市| 韶关市| 兴义市| 阿拉善盟| 金秀| 陇南市| 防城港市| 阿城市| 化隆| 余江县| 晋中市| 桓仁| 西华县| 海宁市| 乐都县| 蒙城县| 博罗县| 墨江| 昌图县| 滨州市| 合阳县| 达拉特旗| 余江县| 新蔡县| 定安县| 三河市| 横峰县| 高唐县| 微山县| 双辽市| 大城县| 宜川县|