<?php $s = 123; assert("is_int($s)"); ?>從這個例子能夠看到字符串參數會被執行,這跟eval()相似。不過eval($code_str)只是執行符合php編碼規範的$code_str。
若是按照默認值來,在程序的運行過程當中調用assert()來進行判斷表達式,遇到false時程序也是會繼續執行的,這在生產環境中這樣使用是很差的,而 在開發調試環境中,倒是一種debug的不錯的方式。特別是用上callback的方法,能夠知道具體的出錯信息。例如:php
<?php // 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("")'); ?>因此,php的官方文檔裏頭是建議將assert用來進行debug,咱們能夠發現還有一個開關ASSERT_ACTIVE能夠用來控制是否開啓debug。
個人建議是,既然assert主要做用是debug,就不要在程序發佈的時候還留着它。在程序中用assert來對錶達進行判斷是不明智的,緣由上文說了, 一個是在生產環境中assert可能被disabled,因此assert不能被徹底信任;二是assert()能夠被繼續執行;而若是在生產環境讓ASSERT_ACTIVE=1,那這個表達式字符串能夠被執行自己就存在安全隱患。例如:mysql
<?php function fo(){ $fp = fopen("c:/test.php",'w'); fwrite($fp,"123"); fclose($fp); return true; } assert("fo()"); ?>