アサーション構文¶
Psalmのアサーションアノテーションは、さまざまなアサーションをサポートしています。
Psalmのアサーションは以下の形式を取ります:
@psalm-assert(-if-true|-if-false)? (Assertion) (Variable or Property)
ここでのAssertionには多くの形式があります:
通常のアサーション¶
is_xxx アサーション¶
ほとんどのis_xxx PHP関数には、例えばis_intに対するintのような対応するアサーションがあります。以下は完全なリストです:
intfloatstringboolscalarcallablecountablearrayiterablenumericresourceobjectnull
したがって、カスタムバージョンのis_intは、Psalmで以下のようにアノテーションを付けることができます:
オブジェクト型アサーション¶
任意のクラスをアサーションとして使用できます。例:
@psalm-assert SomeObjectType $foo
ジェネリックアサーション¶
ジェネリック型パラメータもアサートできるようになりました。例:
@psalm-assert array<int, string> $foo
否定アサーション¶
上記のどのアサーションも否定することができます:
これは$fooがintではないことをアサートします:
これは$barがSomeObjectType型のオブジェクトではないことをアサートします:
ブールアサーション¶
これは$barがtrueであることをアサートします:
これは$barがfalseではないことをアサートします:
等価性アサーション¶
Psalmはassert($some_int === $other_int)と同等のものを以下の形式でサポートしています:
以下のアサーションとの間には2つの違いがあります:
まず、=intの否定には意味がありません:
<?php
/** @psalm-assert-if-true =int $x */
function equalsFive($x) {
return is_int($x) && $x === 5;
}
function foo($y) : void {
if (equalsFive($y)) {
// $yは確実にintです
} else {
// $yはintかもしれませんが、そうでないかもしれません
}
}
function bar($y) : void {
if (is_int($y)) {
// $yは確実にintです
} else {
// $yは確実にintではありません
}
}
次に、equalsFive($some_int)を呼び出すことは、PsalmではRedundantConditionではありませんが、is_int($some_int)を呼び出すことはRedundantConditionです。