PHP 8.0 のリリースでは、新しい型である Union 型 (「ユニオン型」とも呼ばれます) が導入されました。これは、変数が複数の型の 1 つであることを宣言するために使用できます。
多くのオブジェクト指向言語では、ポリモーフィズムの概念を使用して、変数が独自の型、そのサブタイプ、または実装されたインターフェイスのインスタンスになり得ることを定義できます。しかし、PHP では、switch、if、elseif 条件ブロックなど、数種類の条件文を組み合わせることでのみこの目標を達成できました。このアプローチは場合によっては面倒で、維持するのが困難です。
したがって、PHP8.0 では、条件文を取り除くポリモーフィズムを実現するために、新しい共用体型を追加しました。この記事では、共用体型の定義、使用法、構文、およびいくつかの考慮事項を紹介します。
- 共用型の定義
共用型変数を定義する場合は、複数の型の名前を縦棒 (|) で区切る必要があります。次に例を示します。
function foo(int|float|string $param) {}
ログイン後にコピー
これはパラメータ $param を定義します。これは、整数、浮動小数点、または文字列タイプのいずれかになります。
通常、null キーワードを使用して、共用体型の変数を null 値にできることを指定することもできます。
function bar(string|null $param) {}
ログイン後にコピー
これは、$param が 2 つの異なる型 (string または null) を持つことができることを意味します。 。
ただし、共用体型は再帰的定義をサポートしません。つまり、次の構文は使用できません。
function baz(int|float|array $param, string|null|float $other) {}
ログイン後にコピー
共用体型を使用する
関数、メソッドのパラメータ、戻り値の型で共用体型を使用すると非常に便利です。 、プロパティなど。次に例を示します。
// 函数参数中使用union类型:
function test(int|float $param) {}
// 方法返回类型中使用union类型:
class Foo {
public function bar(): string|array {}
}
// 属性类型中使用union类型:
class Baz {
public int|float $foo;
}
ログイン後にコピー
ただし、変数宣言で共用体型を使用すると、いずれかの型の値にのみ割り当てられるため、より制限が厳しくなります。
// 变量声明中使用union类型:
$test = 1|2.0|"three";
$test = "four"; // 可以赋值为其中一个类型的值
$test = false; // 不是其中任何一个类型,将会抛出TypeError
ログイン後にコピー
is_int()、is_float()、is_string() およびその他の関数を使用して共用体型変数をチェックできます。
注意事項-
ユニオン型を使用すると、さまざまなシナリオでメンテナンスやコードの繰り返しが軽減されますが、注意すべき点もいくつかあります。
まず、共用体型の使用には注意が必要です。その柔軟性により、コードが複雑になる可能性があるからです。コード内の共用体型が多すぎる場合は、特に関数やメソッドのパラメーターと戻り値の型に関して、コードの設計上の問題がある可能性があります。
第二に、共用体型は PHP8.0 での新しい変更ですが、すべてのバージョンでサポートされているわけではありません。ユニオン型を使用する場合は、コードが PHP8.0 以降で実行されていることを確認する必要があります。そうでない場合、コードは正しく実行されません。
最後に、共用体型を使用する構文に注意する必要があります。正しい構文は、複数の型名をパイプ (|) で区切ることです (int|float|string や int|float|string ではなく、int|float|string など)。
概要-
PHP8.0 では、新しい共用体型は、複雑な型判定を処理する際のコードに、より柔軟で明確なソリューションを提供します。これは大きな役割を果たしました。これはポリモーフィズムの概念に従っていますが、過度の使用やコードへの悪影響を避けるために、その使用にも注意を払う必要があります。 PHP8.0 へのアップグレードを検討している場合は、union 型を使用してみるのも良いでしょう。おそらく、それが良い助けとなるでしょう。
以上がPHP8.0のユニオン型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。