【modernPHP專題(11)】斷言ASSERT
簡述
編寫程式碼時,我們總是會做出一些假設,斷言就是用於在程式碼中捕捉這些假設,可以將斷言看作是異常處理的一種高階形式。程式設計師斷言在程式中的某個特定點該的表示式值為真。如果該表示式為假,就中斷操作 。
可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。同樣,程式投入執行後,終端使用者在遇到問題時可以重新起用斷言。
使用斷言可以建立更穩定,品質更好且不易於出錯的程式碼。單元測試必須使用斷言!
PHP斷言
# PHP5 bool assert ( mixed $assertion [, string $description ] ) # PHP7 bool assert ( mixed $assertion [, Throwable $exception ] )
example1:
// 斷言操作選項函式 assert_options(ASSERT_ACTIVE, 1); // 預設是開啟斷言的 assert('1==2'); //Warning: assert(): Assertion "1==2" failed in D:\wamp\www\XF9_Trunk_Website3.0\new\Public\index.php on line 3 echo 555555555555; // 預設情況下繼續執行,對於除錯很好,尤其是可以使用callback,但是生產環境就不建議使用了。
assert() 會檢查指定的 assertion 並在結果為 FALSE 時採取適當的行動(視assert_options
而定)。
assert_options
ASSERT_ACTIVE=1 ASSERT_WARNING =1 ASSERT_BAIL= 0 ASSERT_QUIET_EVAL= 0 ASSERT_CALLBACK= (NULL)
// Active assert and make it quiet assert_options(ASSERT_ACTIVE, 1); assert_options(ASSERT_WARNING, 0); assert_options(ASSERT_QUIET_EVAL, 1); // Create a handler function function my_assert_handler($file, $line, $code) { echo "<hr>Assertion Failed:File '$file'<br />Line '$line'<br />Code '$code'<br /><hr />"; } // Set up the callback assert_options(ASSERT_CALLBACK, 'my_assert_handler'); // Make an assertion that should fail assert('mysql_query("")');
安全性
function fo(){ file_put_contents('a.php','www.bo56.com'); return true; } $func = $_GET["func"]; assert("$func()");
如果 assertion 是字串,它將會被 assert() 當做 PHP 程式碼來執行。跟eval()類似, 不過eval($assertion)
只是執行符合php編碼規範的$code_str。
PHP7中的斷言
向後兼用並增強之前的 assert() 的方法。 它使得在生產環境中啟用斷言為零成本,並且提供當斷言失敗時丟擲特定異常的能力。
ini_set('assert.exception', 1); class CustomError extends AssertionError {} assert(2 == 1, new CustomError('Some error message'));