摘要:版本發(fā)布在即,本文整理一下中的一些新特性以供了解。所有內(nèi)容均選自官方文檔??煽疹?lèi)型可空類(lèi)型主要用于參數(shù)類(lèi)型聲明和函數(shù)返回值聲明。主要的兩種形式如下從例子很容易理解,所指的就是通過(guò)的形式表明函數(shù)參數(shù)或者返回值的類(lèi)型要么為指定類(lèi)型,要么為。
可空類(lèi)型PHP 7.1 release版本發(fā)布在即,本文整理一下 7.1 中的一些新特性以供了解。所有內(nèi)容均選自官方 RFC 文檔。
可空類(lèi)型主要用于參數(shù)類(lèi)型聲明和函數(shù)返回值聲明。
主要的兩種形式如下:
function answer(): ?int { return null; //ok } function answer(): ?int { return 42; // ok } function say(?string $msg) { if ($msg) { echo $msg; } }
從例子很容易理解,所指的就是通過(guò) ? 的形式表明函數(shù)參數(shù)或者返回值的類(lèi)型要么為指定類(lèi)型,要么為 null。
此方法也可用于接口函數(shù)的定義:
interface Fooable { function foo(?Fooable $f); }
但有一個(gè)需要注意的地方:如果函數(shù)本身定義了參數(shù)類(lèi)型并且沒(méi)有默認(rèn)值,即使是可空的,也不能省略,否則會(huì)觸發(fā)錯(cuò)誤。如下:
function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // 可行 foo_nullable(null); // 可行 foo_nullable(); // 不可行
但是如果以上函數(shù)的參數(shù)定義為 ?Bar $bar = null 的形式,則第三種寫(xiě)法也是可行的。因?yàn)?= null 實(shí)際上相當(dāng)于 ? 的超集,對(duì)于可空類(lèi)型的參數(shù),可以設(shè)定 null 為默認(rèn)值。
list 的方括號(hào)簡(jiǎn)寫(xiě)我們知道在 PHP5.4 之前只能通過(guò) array() 來(lái)定義數(shù)組,5.4之后添加了 [] 的簡(jiǎn)化寫(xiě)法(省略了5個(gè)字符還是很實(shí)在的)。
// 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];
引申到另外一個(gè)問(wèn)題上,如果我們要把數(shù)組的值賦值給不同的變量,可以通過(guò) list 來(lái)實(shí)現(xiàn):
list($a, $b, $c) = $array;
是否也可以通過(guò) [] 的簡(jiǎn)寫(xiě)來(lái)實(shí)現(xiàn)呢?
[$a, $b, $c] = $array;
以及下一個(gè)特性中會(huì)提到的 list 指定 key:
["a" => $a, "b" => $b, "c" => $c] = $array;
PHP7.1 實(shí)現(xiàn)了這個(gè)特性。但是要注意的是:出現(xiàn)在左值中的 [] 并不是數(shù)組的簡(jiǎn)寫(xiě),是 list() 的簡(jiǎn)寫(xiě)。
但是并不僅僅如此,新的 list() 的實(shí)現(xiàn)并不僅僅可以出現(xiàn)在左值中,也能在 foreach 循環(huán)中使用:
foreach ($points as ["x" => $x, "y" => $y]) { var_dump($x, $y); }
不過(guò)因?yàn)閷?shí)現(xiàn)的問(wèn)題,list() 和 [] 不能相互嵌套使用:
// 不合法 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
上文提到過(guò),新的 list() 的實(shí)現(xiàn)中可以指定key:
$array = ["a" => 1, "b" => 2, "c" => 3]; ["a" => $a, "b" => $b, "c" => $c] = $array;
這也就相當(dāng)于:
$a = $array["a"]; $b = $array["b"]; $c = $array["c"];
和以往的區(qū)別在于以往的 list() 的實(shí)現(xiàn)相當(dāng)于 key 只能是 0, 1, 2, 3 的數(shù)字形式并且不能調(diào)整順序。執(zhí)行以下語(yǔ)句:
list($a, $b) = [1 => "1", 2 => "2"];
會(huì)得到 PHP error: Undefined offset: 0... 的錯(cuò)誤。
而新的實(shí)現(xiàn)則可以通過(guò)以下方式來(lái)調(diào)整賦值:
list(1 => $a, 2 => $b) = [1 => "1", 2 => "2"];
不同于數(shù)組的是,list 并不支持混合形式的 key,以下寫(xiě)法會(huì)觸發(fā)解析錯(cuò)誤:
// Parse error: syntax error, ... list($unkeyed, "key" => $keyed) = $array;
更復(fù)雜的情況,list 也支持復(fù)合形式的解析:
$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;
以及循環(huán)中使用:
$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 返回類(lèi)型
PHP7.0 添加了指定函數(shù)返回類(lèi)型的特性,但是返回類(lèi)型卻不能指定為 void,7.1 的這個(gè)特性算是一個(gè)補(bǔ)充:
function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value }
以下兩種情況都可以通過(guò)驗(yàn)證:
function lacks_return(): void { // valid } function returns_nothing(): void { return; // valid }
定義返回類(lèi)型為 void 的函數(shù)不能有返回值,即使返回 null 也不行:
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 也只適用于返回類(lèi)型,并不能用于參數(shù)類(lèi)型聲明,或者會(huì)觸發(fā)錯(cuò)誤:
function foobar(void $foo) { // Fatal error: void cannot be used as a parameter type }
類(lèi)函數(shù)中對(duì)于返回類(lèi)型的聲明也不能被子類(lèi)覆蓋,否則會(huì)觸發(fā)錯(cuò)誤:
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 } }類(lèi)常量屬性設(shè)定
這個(gè)特性說(shuō)起來(lái)比較簡(jiǎn)單,就是現(xiàn)在類(lèi)中的常量支持使用 public、private 和 protected 修飾了:
class Token { // 常量默認(rèn)為 public const PUBLIC_CONST = 0; // 可以自定義常量的可見(jiàn)范圍 private const PRIVATE_CONST = 0; protected const PROTECTED_CONST = 0; public const PUBLIC_CONST_TWO = 0; // 多個(gè)常量同時(shí)聲明只能有一個(gè)屬性 private const FOO = 1, BAR = 2; }
此外,接口(interface)中的常量只能是 public 屬性:
interface ICache { public const PUBLIC = 0; const IMPLICIT_PUBLIC = 1; }
為了應(yīng)對(duì)變化,反射類(lèi)的實(shí)現(xiàn)也相應(yīng)的豐富了一下,增加了 getReflectionConstant 和 getReflectionConstants 兩個(gè)方法用于獲取常量的額外屬性:
class testClass { const TEST_CONST = "test"; } $obj = new ReflectionClass( "testClass" ); $const = $obj->getReflectionConstant( "TEST_CONST" ); $consts = $obj->getReflectionConstants();多條件 catch
在以往的 try ... catch 語(yǔ)句中,每個(gè) catch 只能設(shè)定一個(gè)條件判斷:
try { // Some code... } catch (ExceptionType1 $e) { // 處理 ExceptionType1 } catch (ExceptionType2 $e) { // 處理 ExceptionType2 } catch (Exception $e) { // ... }
新的實(shí)現(xiàn)中可以在一個(gè) catch 中設(shè)置多個(gè)條件,相當(dāng)于或的形式判斷:
try { // Some code... } catch (ExceptionType1 | ExceptionType2 $e) { // 對(duì)于 ExceptionType1 和 ExceptionType2 的處理 } catch (Exception $e) { // ... }
對(duì)于異常的處理簡(jiǎn)化了一些。
附:源 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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30449.html
摘要:以下分別備忘版本的部分新增特性。而且,在生成器沒(méi)有輸出完全時(shí),使用會(huì)報(bào)錯(cuò)。報(bào)錯(cuò)定義常量數(shù)組多聲明數(shù)組解構(gòu)運(yùn)行時(shí)將部分指令轉(zhuǎn)為機(jī)器碼。對(duì)于計(jì)算密集型應(yīng)用有較高的性能提升。 以下分別備忘 PHP 7.0 & 7.1 版本的部分新增特性。 PHP 7.0 ?? 運(yùn)算符 $foo = null; $bar = $foo ?? 123; // 相當(dāng)于 $bar = isset($bar) ? ...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
閱讀 2113·2021-11-16 11:45
閱讀 1184·2021-10-22 09:53
閱讀 4002·2021-09-07 10:26
閱讀 1209·2021-09-06 15:00
閱讀 2073·2019-08-28 18:09
閱讀 2795·2019-08-26 14:06
閱讀 3934·2019-08-26 13:48
閱讀 1296·2019-08-26 12:11