国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP 7.1新特性的匯總介紹

2024-05-04 23:53:45
字體:
來源:轉載
供稿:網友

一、可空類型

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

主要的兩種形式如下:

<?phpfunction answer(): ?int { return null; //ok}function answer(): ?int { return 42; // ok}function say(?string $msg) { if ($msg) { echo $msg; }}

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

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

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

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

<?phpfunction 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 來實現:

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

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

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

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

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

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

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

<?phpforeach ($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 的數字形式并且不能調整順序。執行以下語句:

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

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

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

<?phplist(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 的這個特性算是一個補充:

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

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

<?phpfunction lacks_return(): void { // valid}function returns_nothing(): void { return; // valid}

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

<?phpfunction 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 也只適用于返回類型,并不能用于參數類型聲明,或者會觸發錯誤:

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

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

<?phpclass 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 修飾了:

<?phpclass 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 屬性:

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

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

<?phpclass testClass { const TEST_CONST = 'test';}$obj = new ReflectionClass( "testClass" );$const = $obj->getReflectionConstant( "TEST_CONST" );$consts = $obj->getReflectionConstants();

六、多條件 catch

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

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

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

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

對于異常的處理簡化了一些。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用PHP7.1能有一定的幫助,如果有疑問大家可以留言交流。

附:源 RFC 地址

Nullable Types
Square bracket syntax for array destructuring assignment
Allow specifying keys in list()
Generalize support of negative string offsets
Void Return Type
Class constant visibility modifiers
Multi catch


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 黄山市| 淄博市| 蚌埠市| 武宣县| 长沙市| 习水县| 织金县| 肇庆市| 桃园市| 大石桥市| 荥经县| 焉耆| 三都| 团风县| 大渡口区| 车险| 吉水县| 镶黄旗| 涡阳县| 丰台区| 章丘市| 河源市| 孙吴县| 贞丰县| 丽江市| 江源县| 锦屏县| 嵩明县| 新平| 萍乡市| 若尔盖县| 福州市| 昌平区| 体育| 墨竹工卡县| 龙南县| 化隆| 休宁县| 济宁市| 城步| 台北市|