好像大都人都以為Include文件是一件很是簡(jiǎn)樸的工作,惋惜裂痕往往呈此刻我們忽視的處所。正所謂千里之堤潰于蟻穴,二戰(zhàn)期間,法國(guó)人寄但愿與馬奇諾防地,卻忽視了原本認(rèn)為很是安詳?shù)陌⒌歉叩兀尩聡?guó)人有機(jī)可乘,最終的功效各人都知道了。
下面這個(gè)例子固然是我杜撰的,可是我確信現(xiàn)實(shí)環(huán)境里必然存在雷同的問(wèn)題:
<?php
$debug = false;
// ...
$config = include 'config.php';
// ...
if ($debug) {
phpinfo();
}
?>
碼農(nóng)在代碼中埋了一個(gè)調(diào)試開(kāi)關(guān),缺省是封鎖狀態(tài),須要的時(shí)候可以開(kāi)啟,以便顯示一些非凡的信息,同時(shí)代碼里包括了一個(gè)設(shè)置文件,,它的內(nèi)容大抵如下所示:
<?php
return array(
'foo' => '...',
'bar' => '...',
);
?>
溘然有一天,碼農(nóng)因?yàn)橐恍┢渌木売尚薷牧嗽O(shè)置文件,引入了一些姑且變量:
<?php
$debug = true;
$config = array(
'foo' => '...',
'bar' => '...',
);
/*
if ($debug) {
var_dump($config);
}
*/
return $config;
?>
功效問(wèn)題發(fā)生了!設(shè)置文件里的姑且變量(debug)污染了其它劇本的變量空間,進(jìn)而導(dǎo)致代碼執(zhí)行的功效不再切合預(yù)期,最終問(wèn)題也就在所不免了。
如何安詳?shù)腎nclude文件?很簡(jiǎn)樸,在Include的時(shí)候留意限制變量的浸染域即可:
<?php
$config = call_user_func(function() {
return include 'config.php';
});
?>
雷同的做法在Javascript中很常見(jiàn),但在PHP中卻鮮有人留意,你的代碼有問(wèn)題么?