eval

(PHP 4, PHP 5, PHP 7, PHP 8)

eval把字符串作為PHP代碼執(zhí)行

說(shuō)明

eval(string $code): mixed

把字符串 code 作為PHP代碼執(zhí)行。

警告

函數(shù)eval()語(yǔ)言結(jié)構(gòu)是 非常危險(xiǎn)的, 因?yàn)樗试S執(zhí)行任意 PHP 代碼。 它這樣用是很危險(xiǎn)的。 如果您仔細(xì)的確認(rèn)過(guò),除了使用此結(jié)構(gòu)以外 別無(wú)方法, 請(qǐng)多加注意,不要允許傳入任何由用戶 提供的、未經(jīng)完整驗(yàn)證過(guò)的數(shù)據(jù) 。

參數(shù)

code

需要被執(zhí)行的字符串

代碼不能包含打開(kāi)/關(guān)閉 PHP tags。比如, 'echo "Hi!";' 不能這樣傳入: '<?php echo "Hi!"; ?>'。但仍然可以用合適的 PHP tag 來(lái)離開(kāi)、重新進(jìn)入 PHP 模式。比如 'echo "In PHP mode!"; ?>In HTML mode!<?php echo "Back in PHP mode!";'。

除此之外,傳入的必須是有效的 PHP 代碼。所有的語(yǔ)句必須以分號(hào)結(jié)尾。比如 'echo "Hi!"' 會(huì)導(dǎo)致一個(gè) parse error,而 'echo "Hi!";' 則會(huì)正常運(yùn)行。

return 語(yǔ)句會(huì)立即中止當(dāng)前字符串的執(zhí)行。

代碼執(zhí)行的作用域是調(diào)用 eval() 處的作用域。因此,eval() 里任何的變量定義、修改,都會(huì)在函數(shù)結(jié)束后被保留。

返回值

eval() 返回 null,除非在執(zhí)行的代碼中 return 了一個(gè)值,函數(shù)返回傳遞給 return 的值。 PHP 7 開(kāi)始,執(zhí)行的代碼里如果有一個(gè) parse error,eval() 會(huì)拋出 ParseError 異常。在 PHP 7 之前, 如果在執(zhí)行的代碼中有 parse error,eval() 返回 false,之后的代碼將正常執(zhí)行。無(wú)法使用 set_error_handler() 捕獲 eval() 中的解析錯(cuò)誤。

范例

示例 #1 eval() 例子 - 簡(jiǎn)單的文本合并

<?php
$string 
'cup';
$name 'coffee';
$str 'This is a $string with my $name in it.';
echo 
$str"\n";
eval(
"\$str = \"$str\";");
echo 
$str"\n";
?>

以上例程會(huì)輸出:

This is a $string with my $name in it.
This is a cup with my coffee in it.

注釋

注意: 因?yàn)槭且粋€(gè)語(yǔ)言構(gòu)造器而不是一個(gè)函數(shù),不能被 可變函數(shù) 調(diào)用。

小技巧

和直接將結(jié)果輸出到瀏覽器一樣,可使用輸出控制函數(shù)來(lái)捕獲當(dāng)前函數(shù)的輸出,然后(例如)保存到一個(gè) string 中。

注意:

如果在執(zhí)行的代碼中產(chǎn)生了一個(gè)致命的錯(cuò)誤(fatal error),整個(gè)腳本會(huì)退出。

參見(jiàn)

  • call_user_func() - 把第一個(gè)參數(shù)作為回調(diào)函數(shù)調(diào)用