インターセクション型¶
Type1&Type2&Type3
形式のアノテーションは インターセクション型 です。任意の値は Type1
、Type2
、Type3
を同時に満たす必要があります。Type1
、Type2
、Type3
はすべて アトミック型 です。
例えば、PHPUnitテストで次のステートメントの後:
$hare
は Hare
を拡張し、\PHPUnit\Framework\MockObject\MockObject
を実装するクラスのインスタンスになります。そのため、$hare
は Hare&\PHPUnit\Framework\MockObject\MockObject
と型付けされます。この構文は、値が複数のインターフェースを実装する必要がある場合はいつでも使用できます。
もう1つの使用例は、オブジェクトライクな配列をマージできるようにすることです:
/**
* @psalm-type A=array{a: int}
* @psalm-type B=array{b: int}
*
* @param A $a
* @param B $b
*
* @return A&B
*/
function foo($a, $b) {
return $a + $b;
}
返される型には A
と B
の両方のプロパティが含まれます。言い換えれば、{a: int, b: int}
になります。
インターセクションは、オブジェクト型 のリストのみ、または オブジェクトライクな配列 のリストのみに対して有効です。