Skip to content

アサーション構文

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で以下のようにアノテーションを付けることができます:

<?php
/** @psalm-assert-if-true int $x */
function custom_is_int($x) {
  return is_int($x);
}

オブジェクト型アサーション

任意のクラスをアサーションとして使用できます。例: @psalm-assert SomeObjectType $foo

ジェネリックアサーション

ジェネリック型パラメータもアサートできるようになりました。例: @psalm-assert array<int, string> $foo

否定アサーション

上記のどのアサーションも否定することができます:

これは$foointではないことをアサートします:

<?php
/** @psalm-assert !int $foo */

これは$barSomeObjectType型のオブジェクトではないことをアサートします:

<?php
/** @psalm-assert !SomeObjectType $bar  */

ブールアサーション

これは$bartrueであることをアサートします:

<?php
/** @psalm-assert true $bar  */

これは$barfalseではないことをアサートします:

<?php
/** @psalm-assert !false $bar  */

等価性アサーション

Psalmはassert($some_int === $other_int)と同等のものを以下の形式でサポートしています:

<?php
/** @psalm-assert =int $some_int */

以下のアサーションとの間には2つの違いがあります:

<?php
/** @psalm-assert int $some_int */

まず、=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です。

ユーザーノート