Nullable 型
Nullable 型は、主にパラメーターの型宣言と関数の戻り値の宣言に使用されます。
主な 2 つの形式は次のとおりです:
<?phpfunction answer(): ?int { return null; //ok}function answer(): ?int { return 42; // ok}function say(?string $msg) { if ($msg) { echo $msg; }}
これが何を意味するかというと、関数のパラメータまたは戻り値の型が指定された型であることを示すために使用されます。ヌル。
このメソッドはインターフェイス関数の定義にも使用できます:
<?php interface Fooable { function foo(?Fooable $f);}
ただし、注意すべき点が 1 つあります。関数自体がパラメーターの型を定義しており、デフォルト値がない場合は、たとえそれが null 許容であっても、それを定義することはできません。省略した場合、エラーが発生します。以下の通り:
<?php function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // 可行foo_nullable(null); // 可行foo_nullable(); // 不可行
ただし、上記の関数のパラメータが ?Bar $bar = null の形式で定義されている場合は、3 番目の書き方も可能です。 = null は実際には ? のスーパーセットと同等であるため、null 許容型パラメータの場合は、デフォルト値として null を設定できます。
リストの大括弧の略称
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];
は別の質問に拡張されます。配列の値を別の変数に割り当てたい場合は、リストを使用して実現できます。
<?php list($a, $b, $c) = $array;
[] の省略形でも実現できますか?
<?php [$a, $b, $c] = $array;
と次の機能で説明するリスト指定キー:
<?php ["a" => $a, "b" => $b, "c" => $c] = $array;
PHP7.1 はこの機能を実装します。ただし、lvalue に表示される [] は array の略ではなく、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() 実装で指定できます:
<?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() の実装は、キーが 0、1、2、3 の数値形式のみであり、順序を調整できないという事実と同等であることです。次のステートメントを実行すると、
<?php list($a, $b) = [1 => '1', 2 => '2'];
というエラーが発生します。 PHP エラー: 未定義のオフセット: 0... 。
新しい実装では、次の方法で割り当てを調整できます:
<?php list(1 => $a, 2 => $b) = [1 => '1', 2 => '2'];
配列とは異なり、リストは混合キーをサポートしません。次の記述は解析エラーを引き起こします:
<?php // Parse error: syntax error, ...list($unkeyed, "key" => $keyed) = $array;
より複雑な状況では、リストもサポートされます。複合形式の解析:
<?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 では関数の戻り値の型を指定する機能が追加されましたが、7.1 のこの機能は戻り値の型を void として指定できません。補足とみなされます:
<?php function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value}
次の 2 つの状況が検証できます:
<?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 }}
クラス定数属性設定
この機能の説明は比較的簡単です。つまり、クラス内の定数がパブリック、プライベート、および保護された変更の使用をサポートするようになりました:
<?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;}
さらに、インターフェイス (インターフェイス) 内の定数はパブリック属性のみにすることができます。
<?php interface ICache { public const PUBLIC = 0; const IMPLICIT_PUBLIC = 1;}
変更に対応するために、リフレクション クラスの実装もそれに応じて充実しました。しばらくして、定数の追加属性を取得するための 2 つのメソッド getReflectionConstant と getReflectionConstants が追加されました。 try...catch ステートメントでは、各 catch は 1 つの条件判定のみを設定できます:
<?php class testClass { const TEST_CONST = 'test'; } $obj = new ReflectionClass( "testClass" ); $const = $obj->getReflectionConstant( "TEST_CONST" ); $consts = $obj->getReflectionConstants();
新しい実装では、1 つの catch で複数の条件を設定できます。これは、or の形式判定と同等です:
<?php try { // Some code... } catch (ExceptionType1 $e) { // 处理 ExceptionType1} catch (ExceptionType2 $e) { // 处理 ExceptionType2} catch (Exception $e) { // ...}
上記はPHP 7.1 の新機能の内容 さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。