PHP のアサーションは、式またはステートメントが FALSE かどうかを確認するデバッグによく使用されます。この記事では、PHP のassert() 関数の能力を再理解します。
この記事は PHP バージョン 7.1.28 に基づいています
1. アサーションとは
プログラムを作成する際には、特定の前提条件が必要です。アサーションは、仮説的な例外を捕捉するために使用されます。また、アサーションを例外の特殊な形式と考えることもできます。
アサーションは通常、プログラムの実行構造を判断するために使用され、ビジネス プロセスの処理には使用できません。最も一般的に使用されるシナリオは単体テストであり、一般的な単体テスト フレームワークではアサーションが使用されます。
assert(1 == 2); // 运行结果: // Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25
2. PHP でのアサーション
PHP では、式をアサートするために assert() 関数が使用されます。
// PHP 5assert ( mixed $assertion [, string $description ] ) : bool // PHP 7assert ( mixed $assertion [, Throwable $exception ] ) : bool
4. 従来のアサーション メソッド
パラメータ アサーションは、式と式文字列の両方をサポートします (特定のシナリオで使用されるものもあります) (文字列式が正当かどうかの判断など)
アサーションが文字列の場合、assert() によって PHP コードとして実行されます。アサーションを文字列にする利点は、アサーションが無効になっているときにコストが安くなり、アサーションが失敗したときにメッセージにアサーション式が含まれることです。
この機能はデバッグにのみ使用する必要があることを主張します。これを健全性チェックに使用して、条件が常に TRUE であるべきかどうかをテストしたり、何らかのプログラム エラーを示したり、特定の機能 (拡張機能や特定のシステム制限や機能など) の存在をチェックしたりする必要があります。
アサーションは、入力パラメータのチェックなどの通常のランタイム操作には使用しないでください。経験則として、アサーションが無効になっている場合でも、コードは正しく実行されるはずです。
例:
function my_assert_handler($file, $line, $code, $desc){ echo "Assertion Failed: File '{$file}' Line '{$line}' Code '{$code}' Desc '{$desc}' "; } // 设置回调函数 assert_options(ASSERT_CALLBACK, 'my_assert_handler'); // 让一则断言失败 assert('1 == 2', '1 不可能等于 2');
実行結果:
Assertion Failed: File '/Users/shocker/Desktop/demo.php' Line '29' Code '1 == 2' Desc '1 不可能等于 2'
5. 例外アサーションのサポート
PHP 7 では、assert () は、異なる環境で異なる対策を有効にするための言語構造です。詳細については、 zend.assertions 設定を参照してください。
さらに、 AssertionError によるエラーのキャプチャもサポートしています。
使用例:
assert_options(ASSERT_EXCEPTION, 1); // 在断言失败时产生异常 try { // 用 AssertionError 异常替代普通字符串 assert(true == false, new AssertionError('True is not false!')); } catch (Throwable $e) { echo $e->getMessage(); }
実行結果:
True is not false!
6. アサーション動作の制御
PHP はassert_options() をサポートしています。アサーションを設定します。ini を使用して設定することもできます。
次の設定では、assert_options() 関数の設定に定数フラグが使用され、ini_set() 関数に ini 設定が使用されます。設定しても、効果は同じです。
zend.assertions は、さまざまなオペレーティング環境でのアサーションの動作を制御する特別な構成 (PHP 7.0.0 以上でサポート) です。 ini_set() でのみ設定できます。また、1 に設定した場合は -1 に設定することはできず、その逆も同様であり、その他は制限されません。
1: コードをコンパイルして実行します (開発モード)
0: コードを編集しますが、実行時はスキップします
-1: コードをコンパイルしません ( Production モード)
7. バージョンの非互換性
PHP >= 5.4.8、ASSERT_CALLBACK モードの 4 番目のパラメータとして説明を指定できます。コールバック関数
PHP 5 では、パラメータ アサーションは実行可能な文字列、または結果がブール値になる式である必要があります
PHP 7 では、パラメータ アサーションは任意の式にすることができ、次を使用します。アサーションの基礎としての操作結果
PHP 7 では、パラメータ例外は Throwable オブジェクトにすることができ、これは式の実行エラーや失敗したアサーション結果をキャプチャするために使用されます。 (もちろん、assert.Exception をオンにする必要があります)
PHP >= 7.0.0、zend.assertions、assert.Exception 関連の構成と機能をサポート
PHP >= から開始バージョン 7.2、パラメータ アサーションは文字列
Deprecated: assert(): Calling assert() with a string argument is deprecated
をサポートしなくなりました。 8. アプリケーション シナリオ
デバッグ出力:
最初に例を見てください:
assert('1 == 2', '1 不可能等于 2');
実行結果:
Warning: assert(): 1 不可能等于 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10
類似:
$expression = 1 == 2; if (!($expression)) { echo "1 不可能等于 2\n"; var_dump($expression); echo __FILE__ . "\n"; }
ただし、$expression の具体的な式や具体的な実行行数はわかりません。
#9. 単体テスト
#
function arraySum(array $nums) { $sum = 0; foreach ($nums as $n) { $sum += $n; } return $sum; } assert(arraySum([1, 2, 3]) == 6, 'arraySum() 测试不通过:'); assert(is_numeric(arraySum([1, 2, 3])), 'arraySum() 测试不通过:');
#ヒント:
## 開始#PHP 7 では、構文エラーなどの PHP 組み込みエラーをキャプチャするための新しい Error クラスが追加されました。 Error と以前の Exception は両方とも Throwable から継承しているため、7.0.0 以降、Throwable はすべてのエラーと例外をキャッチできるようになりました。 次の例は、文字列式が正当な PHP 式であるかどうかを確認する方法を示しています。try { assert('a +== 1'); } catch (Throwable $e) { echo $e->getMessage(), "\n"; }
Failure evaluating code: a +== 1
ten 1. セキュリティ問題
次のコードを使用すると結果はどうなりますか?
function demo(){ file_put_contents('data.log', 'shockerli.net'); return true; } $func = $_GET["func"]; assert("$func()");
所以,对于 assert 函数,正常情况下是不建议用于生产环境的。
与 eval 一样会执行任何 PHP 代码,危害极大。这也是 PHP 从 7.2 开始废弃支持字符串表达式的原因
感谢您的阅读,如有错误请指出。
相了解更多相关问题请访问PHP中文网:PHP视频教程
以上がPHP アサーションとは何ですか?それの使い方?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。