这有点特别;我不认为这实际上是可能的,但SO社区一次又一次让我感到惊讶;所以这里.
在PHP中给出;我有以下代码段:
$path = 'path/to/file.php';
$buffer = call_user_func(function() use($path){
ob_start();
require $path;
return ob_get_clean();
});
包含时,path / to / file.php将在其范围内包含$path.有没有办法阻止此变量在包含文件的上下文中可用?
例如,给定unset()返回它未设置的变量的值,我可以这样做:
require unset($path);
但当然这不起作用.
对于那些好奇的人,我试图阻止$path继承include-er中的值.
“通过混淆安全”是我所做的考虑;传递像$thisIsThePathToTheFileAndNobodyBetterUseThisName这样的东西,但这看起来有点傻,但仍然不是万无一失的.
对于应该继承的其他“保留”变量,我已经使用了extract()和unset():
$buffer = call_user_func(function() use($path, $collection){
extract($collection);
unset($collection);
ob_start();
// ...
编辑:
我最终选择了什么:
$buffer = call_user_func(function() use(&$data, $registry){
extract($registry, EXTR_SKIP);
unset($registry);
ob_start();
// only $data and anything in $registry (but not $registry) are available
require func_get_arg(0);
return ob_get_clean();
}, $viewPath);
也许我的问题有点误导,通过使用use()将变量传递给匿名函数范围;传递参数是我忽略的一个选择.
关于@hakre和use()func_get_args():
$var = 'foo';
$func = function() use($var){
var_dump(func_get_args());
};
$func(1, 2, 3);
/* produces
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
解决方法:
使用func_get_arg()
而不是使用传统的函数参数:
$buffer = call_user_func(function() {
ob_start();
require func_get_arg(0);
return ob_get_clean();
}, $path);