作成日:2019-10-31, 更新日:2019-10-31
基本
・目的は「想定条件を明記するため」。
→コメントでもいいのに・・・と思うけどそのコメントがデタラメって可能性を考えるとassertのほうが無難かな。
・本番環境では使わない。テスト環境、デバッグなどで使う
→本番環境では機能を無効にして処理をスキップさせる
・assertで条件が「false」のときにエラーを出力させたりする
→ユニットテストとかでも使える
サンプル
PHP5と7で微妙に異なるそうだ。
※「AssertionError」が7.2以上
PHP7.2未満
PHP7.2以上でも使えるが非推奨とかも含まれる内容
assert_options(ASSERT_ACTIVE, 1); // assert() による評価を有効にする(初期値:1) assert_options(ASSERT_WARNING, 1); // assersion に失敗した場合に PHP 警告を発生する(初期値:1) assert_options(ASSERT_BAIL, 1); // assersion に失敗した場合に実行を終了する(初期値:0) assert_options(ASSERT_QUIET_EVAL, 1); // assersion 式については error_reporting を無効にする(初期値:0) assert_options(ASSERT_CALLBACK, 'my_assert_handler'); // assertion に失敗した場合にコールされるコールバック(初期値:null) // 「assert_options()」の「ASSERT_CALLBACK」で設定したコールバック関数 function my_assert_handler($file, $line, $code) { $err = 'Assertion Failed - ' . 'File:' . $file . ', ' . 'Line:' . $line . ', ' . 'Code:' . $code . ', ' . ''; echo $err; } $a = 5; // 条件が「false」のときにエラーを出力する assert($a!==''); assert($a<=0); var_dump($a);
PHP7.2以上
PHP7.2未満でも途中まで使える。設定次第では使えるかも?(未調査)
// ▼PHP7.2以上:php.ini ディレクティブに記載 or 直接記述 ini_set('zend.assertions', 1); // 1:アサーションのコードを生成して実行(開発モード)。 // 0:アサーションのコードは生成しますが実行時にはスキップ(実行しません)。 // -1:アサーションのコードを生成せず、アサーションのコストがゼロになる(実運用モード)。 ini_set('assert.exception', 1); // 1: アサーションに失敗→exception で指定したオブジェクトをスロー or exception を指定していない場合は AssertionError オブジェクトをスロー。 // 0: 先述の Throwable を使ったり生成したりしますが、 そのオブジェクト上で警告を生成するだけであり、スローしません (PHP 5 と互換性のある挙動です)。 // ▲PHP7.2以上:php.ini ディレクティブに記載 or 直接記述 function my_assert_handler($e) { $objErr = array( 'Message' => $e->getMessage(), 'Previous' => $e->getPrevious(), 'Code' => $e->getCode(), 'File' => $e->getFile(), 'Line' => $e->getLine(), 'Trace' => $e->getTrace(), 'TraceAsString' => $e->getTraceAsString(), ); var_export($objErr); } $a = 5; // 条件が「false」のときにエラーになる try { assert($a!==''); assert($a<=0); } catch (AssertionError $e) { // 「assert.exception=1」で「AssertionError」が無ければ「Fatal error: Uncaught AssertionError」になる // 「assert.exception=0」ならPHP5とかで使ってた「ASSERT_WARNING」と同じ挙動になる my_assert_handler($e); } catch (Exception $e) { // ココには入ってこない。設定次第では入ってくるかも?(未調査) echo 'Exception:' . $e->getMessage(); } var_dump($a);