來源:不言 發(fā)布時間:2019-03-19 14:21:54 閱讀量:1058
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于php中assert和eval的詳細(xì)介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
assert 判斷一個表達(dá)式是否成立。返回true or false;
1 2 3 4 |
|
從這個例子可以看到字符串參數(shù)會被執(zhí)行,這跟eval()類似。
不過eval($code_str)只是執(zhí)行符合php編碼規(guī)范的$code_str。
eval():該函數(shù)對于在數(shù)據(jù)庫文本字段中供日后計(jì)算而進(jìn)行的代碼存儲很有用。(在生產(chǎn)中也建議少用)
注意:1.eval()里必須是字符串;
2.eval()里的引號必須是雙引號,因?yàn)閱我柌荒芙馕鲎址锏淖兞?str;
eval定義和用法:
(1)eval() 函數(shù)把字符串按照 PHP 代碼來計(jì)算(計(jì)算=執(zhí)行)。
(2)該字符串必須是合法的 PHP 代碼,且必須以分號結(jié)尾。
(3)如果沒有在代碼字符串中調(diào)用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數(shù)返回 false
assert的用法卻更詳細(xì)一點(diǎn)。
assert_option()可以用來對assert()進(jìn)行一些約束和控制;
默認(rèn)值
ASSERT_ACTIVE=1 //Assert函數(shù)的開關(guān)
ASSERT_WARNING =1 //當(dāng)表達(dá)式為false時,是否要輸出警告性的錯誤提示,issue a PHP warning for each failed assertion
ASSERT_BAIL= 0 //是否要中止運(yùn)行;terminate execution on failed assertions
ASSERT_QUIET_EVAL= 0 //是否關(guān)閉錯誤提示,在執(zhí)行表達(dá)式時;disable error_reporting during assertion expression evaluation
ASSERT_CALLBACK= (NULL) // 是否啟動回調(diào)函數(shù) user function to call on failed assertions
php的官方文檔里頭是建議將assert用來進(jìn)行debug,我們可以發(fā)現(xiàn)還有一個開關(guān)ASSERT_ACTIVE可以用來控制是否開啟debug。
現(xiàn)在問題就產(chǎn)生了,如果程序員在開發(fā)的時候在代碼中留下了很多assert(),然后在程序發(fā)布的時候關(guān)閉執(zhí)行,設(shè)置assert_options(ASSERT_ACTIVE,0);這樣做是否可行?有沒有安全問題?
既然assert主要作用是debug,就不要在程序發(fā)布的時候還留著它。在程序中用assert來對表達(dá)進(jìn)行判斷是不明智的,原因上文說了, 一個是在生產(chǎn)環(huán)境中assert可能被disabled,所以assert不能被完全信任;二是assert()可以被繼續(xù)執(zhí)行;而如果在生產(chǎn)環(huán)境讓 ASSERT_ACTIVE=1,那這個表達(dá)式字符串可以被執(zhí)行本身就存在安全隱患。assert引起的代碼注射
例如
1 2 3 4 5 6 7 8 9 |
|