【PHP8.x】assert関数の使い方

作成日: 更新日:

assert関数は、プログラムのコードが期待通りに動作しているかを検査する「アサーション(表明)」を実行する関数です。この関数は主に開発段階でのデバッグに用いられます。引数に渡された式を評価し、その結果がfalseであった場合にAssertionErrorという例外をスローしてプログラムの実行を停止させます。もし式の結果がtrueであれば、何も起こらずに処理が続行されます。これにより、開発者は関数の引数や戻り値が特定の条件を満たしているか、あるいは変数が期待される状態にあるかといった、プログラムの前提条件が正しいことを実行時に確認できます。assert関数の動作は、php.iniファイルのzend.assertionsディレクティブによって制御されます。この設定値を1にするとアサーションが有効になり、-1にするとアサーションのコードが生成されなくなるため、本番環境ではパフォーマンスへの影響をゼロにできます。この仕組みによって、開発中は厳密なチェックを行い、本番運用ではそのオーバーヘッドを排除することが可能です。

基本的な使い方

構文(syntax)

<?php
assert(true);

引数(parameters)

mixed $assertion, Throwable|string|null $description = null

  • mixed $assertion: 真偽判定を行う式。真偽値、または真偽値として評価できる値。
  • Throwable|string|null $description = null: アサーションが失敗した場合に表示される説明。Throwableオブジェクト、文字列、またはnull。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP assert() で厳密な値比較を行う

<?php

/**
 * assert() を使用して、2つの値が型まで含めて同一であることを表明する例。
 *
 * キーワード `assertSame` のような厳密な比較を、assert() と `===` 演算子で
 * 実現する方法を示します。
 *
 * アサーションを有効にして実行してください。
 * コマンドライン実行例: php -d zend.assertions=1 your_script_name.php
 */
function demonstrateAssertSameBehavior(): void
{
    // --- 成功例 ---
    // 2つの値が型も値も同一 (`===`) なので、アサーションは成功します。
    try {
        $expected = 100;
        $actual = 100;

        assert($expected === $actual, '整数 100 は同一であるべきです。');

        echo "成功: 整数 100 と 100 は同一です。\n";
    } catch (AssertionError $e) {
        echo "予期せぬ失敗: " . $e->getMessage() . "\n";
    }

    // --- 失敗例 ---
    // 値は等価 (`==`) ですが、型が異なる (int と string) ため、
    // 同一 (`===`) ではありません。
    // その結果、アサーションは失敗し、AssertionError がスローされます。
    try {
        $expectedNumber = 100;
        $actualString = '100';

        // このアサーションは失敗し、catchブロックが実行されます。
        assert(
            $expectedNumber === $actualString,
            "整数 100 と 文字列 '100' は同一ではありません。"
        );

        // アサーションが失敗するため、この行は実行されません。
        echo "この行は表示されません。\n";

    } catch (AssertionError $e) {
        echo "失敗: アサーションが意図通り失敗しました。\n";
        // assert()の第2引数で指定したメッセージが表示されます。
        echo '  -> ' . $e->getMessage() . "\n";
    }
}

// 関数を実行してデモを行います。
demonstrateAssertSameBehavior();

assert関数は、プログラムの実行中に「この条件は正しいはずだ」という前提(アサーション)が満たされているかを確認するために使われるデバッグ用の機能です。第1引数には真偽値となる条件式($assertion)を指定し、この条件がtrueであれば処理はそのまま続行されます。しかし、条件がfalseだった場合、AssertionErrorというエラーがスローされます。オプションである第2引数($description)には、条件がfalseの際にAssertionErrorのメッセージとして表示される文字列を指定できます。この関数は戻り値を持ちません。

このサンプルコードは、assert関数と、値だけでなく型も厳密に比較する===演算子を組み合わせることで、二つの値が型まで含めて完全に同一であるかを確認する方法をデモンストレーションしています。これは、PHPUnitなどのテストフレームワークにあるassertSameのような厳密な比較を再現するものです。assert関数を有効にするには、コマンドラインでphp -d zend.assertions=1のように実行する必要があります。

成功例では、整数100と整数100===で比較され、型も値も同一であるためアサーションは成功します。失敗例では、整数100と文字列'100'===で比較されます。値は同じでも型が異なるため===falseを返し、その結果AssertionErrorが意図通り発生し、指定したエラーメッセージが表示される動作が確認できます。

PHPのassert関数は、デバッグ時にコードの前提条件が満たされているかを確認するための機能です。本番環境では、パフォーマンスやセキュリティの観点から無効にすることが一般的なため注意が必要です。この機能を利用するには、php -d zend.assertions=1のように実行時にアサーションを有効にする設定が必須となります。サンプルコードでは、値だけでなく型も厳密に一致するかを===演算子で確認しており、これはassertSameの挙動に近いです。アサーションが失敗するとAssertionErrorがスローされるため、意図的にエラーを捕捉する場合はtry-catchで適切にハンドリングしてください。assert関数自体は戻り値を返しません。

PHP assertによる値の範囲チェック

<?php

// PHPのassert機能を有効化します。
// 開発環境では有効にしますが、本番環境では通常無効にします。
ini_set('assert.active', 1);

// assertが失敗した際にAssertionErrorをスローするように設定します。
// PHP 7以降のデフォルトの挙動ですが、明示的に記述することで意図を明確にします。
ini_set('assert.exception', 1);

/**
 * 数値が指定された範囲内にあるかを確認する関数です。
 * assertは、プログラムが特定の条件を「絶対に満たしているはず」という前提が
 * 崩れた場合に、それを早期に検知するために使用します。
 *
 * @param int $value 確認する数値
 * @param int $min 許容される最小値
 * @param int $max 許容される最大値
 * @param string $paramName 確認対象のパラメータ名 (エラーメッセージ用)
 * @return string 条件が満たされた場合のメッセージ
 * @throws AssertionError 条件が満たされない場合、AssertionErrorがスローされます
 */
function validateRange(int $value, int $min, int $max, string $paramName): string
{
    // $value が $min 以上であるべきであることを表明します。
    // この条件がfalseの場合、AssertionErrorがスローされます。
    assert($value >= $min, "{$paramName}{$min}以上である必要があります。現在の値: {$value}");

    // $value が $max 以下であるべきであることを表明します。
    // この条件がfalseの場合、AssertionErrorがスローされます。
    assert($value <= $max, "{$paramName}{$max}以下である必要があります。現在の値: {$value}");

    return "{$paramName}の値 {$value} は有効な範囲 ({$min}{$max}) 内にあります。";
}

echo "--- 正常なケース (assertion成功) ---" . PHP_EOL;
try {
    // 期待通り、条件が満たされるためAssertionErrorはスローされません
    echo validateRange(5, 1, 10, '数値A') . PHP_EOL;
    echo validateRange(1, 1, 10, '数値B') . PHP_EOL;
    echo validateRange(10, 1, 10, '数値C') . PHP_EOL;
} catch (AssertionError $e) {
    // このブロックは通常実行されません
    echo "エラーが発生しました (想定外のAssertionError): " . $e->getMessage() . PHP_EOL;
}

echo PHP_EOL . "--- 異常なケース (assertion失敗) ---" . PHP_EOL;

// 最小値より小さい値でassertionが失敗するケース
try {
    echo validateRange(0, 1, 10, '数値D') . PHP_EOL;
    // 上の行でAssertionErrorがスローされるため、この行は実行されません
} catch (AssertionError $e) {
    // assertが失敗するとAssertionErrorがスローされるため、ここでキャッチできます
    echo "AssertionErrorをキャッチしました: " . $e->getMessage() . PHP_EOL;
}

echo PHP_EOL;

// 最大値より大きい値でassertionが失敗するケース
try {
    echo validateRange(11, 1, 10, '数値E') . PHP_EOL;
    // 上の行でAssertionErrorがスローされるため、この行は実行されません
} catch (AssertionError $e) {
    echo "AssertionErrorをキャッチしました: " . $e->getMessage() . PHP_EOL;
}

?>

PHPのassert関数は、プログラムが特定の条件を「絶対に満たしているはず」という前提が崩れた場合に、それを早期に検知するために使用するデバッグ機能です。主に開発段階でコードの正しさを確認し、予期せぬ状態を早期に発見することを目的とします。本番環境では通常無効にして使用します。

assert関数は二つの引数を取ります。最初の引数$assertionは真偽値として評価される条件です。この条件がtrueであれば何もせず、プログラムの実行を続行します。条件がfalseの場合、二番目の引数$descriptionに指定されたメッセージを持つAssertionErrorがスローされ、プログラムの実行が停止します。戻り値はありません。

サンプルコードでは、まずini_set関数を用いてassert.activeを有効にし、assert.exceptionを有効にすることで、アサーション失敗時にAssertionErrorがスローされるように設定しています。

validateRange関数は、渡された数値が指定された範囲内にあることをassertで確認する例です。正常なケースではassertの条件がtrueとなり、AssertionErrorは発生しません。一方、異常なケースではassertの条件がfalseとなり、指定したエラーメッセージとともにAssertionErrorがスローされます。このAssertionErrortry-catchブロックで捕捉し、エラー処理を行うことができます。このようにassertを活用することで、プログラムの信頼性を高めることができます。

PHPのassert関数は、開発段階でのデバッグやプログラム内部の整合性チェックに特化しています。ユーザー入力の検証など、本番環境で必須となるエラー処理には適しませんので注意が必要です。本番環境では、性能の低下やセキュリティ上のリスクを避けるため、assert.active設定を必ず0(無効)にしてください。特に、assert文内の条件式に副作用がある場合、本番環境でassertが無効化されると、その副作用も実行されなくなり、プログラムの挙動が変わってしまう可能性があります。条件が満たされない場合、assert.exception設定が1であればAssertionErrorがスローされるため、エラー検知に利用できます。

【PHP8.x】assert関数の使い方 | いっしー@Webエンジニア