アサーション構文¶
Psalmのアサーションアノテーションは、さまざまなアサーションをサポートしています。
Psalmのアサーションは以下の形式を取ります:
@psalm-assert(-if-true|-if-false)? (Assertion) (Variable or Property)
ここでのAssertion
には多くの形式があります:
通常のアサーション¶
is_xxx アサーション¶
ほとんどのis_xxx
PHP関数には、例えばis_int
に対するint
のような対応するアサーションがあります。以下は完全なリストです:
int
float
string
bool
scalar
callable
countable
array
iterable
numeric
resource
object
null
したがって、カスタムバージョンの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
です。