在PHP中查看生成和保留名称

这有点特别;我不认为这实际上是可能的,但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);

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...