gpt4 book ai didi

php - 在 PHP 中保护来自 "include pollution"的变量

转载 作者:可可西里 更新时间:2023-10-31 23:34:01 24 4
gpt4 key购买 nike

tl;dr: 有没有一种方法可以防止更改(本质上锁定)在 include() 之前声明/定义的变量通过包含的文件调用?另外,有点相关question .


我想知道可以采取什么措施来避免包含文件的变量污染。例如,给定这个奇特的小函数:

/**
* Recursively loads values by include returns into
* arguments of a callback
*
* If $path is a file, only that file will be included.
* If $path is a directory, all files in that directory
* and all sub-directories will be included.
*
* When a file is included, $callback is invoked passing
* the returned value as an argument.
*
* @param string $path
* @param callable $callback
*/
function load_values_recursive($path, $callback){
$paths[] = path($path);
while(!empty($paths)){
$path = array_pop($paths);
if(is_file($path)){
if(true === $callback(include($path))){
break;
}
}
if(is_dir($path)){
foreach(glob($path . '*') as $path){
$paths[] = path($path);
}
}
}
}

我知道它缺少一些类型检查和其他解释,让我们忽略这些。

无论如何,这个函数基本上筛选了一堆只返回值的“数据”文件(通常是配置数组,或路由表,等等),然后调用传递的回调,以便值可以过滤或排序或以某种方式使用。例如:

$values = array();
load_values_recursive('path/to/dir/', function($value) use(&$values){
$values[] = $value;
});

path/to/dir/ 可能有几个遵循此模板的文件:

return array(
// yay, data!
);

当这些“配置”文件(或其他试图保持这种可移植性和跨功能性)开始包含基本逻辑时,我的问题就来了。总是有可能污染函数的局部变量。例如,一个配置文件,为了聪明起见:

return array(
'path_1' => $path = 'some/long/complicated/path/',
'path_2' => $path . 'foo/',
'path_3' => $path . 'bar/',
);

现在,给定 $path 恰好是相对于当前目录的可见目录,该函数将变得不稳定:

// ...
if(is_file($path)){
if(true === $callback(include($path))){ // path gets reset to
break; // some/long/complicated/path/
}
}
if(is_dir($path)){ // and gets added into the
foreach(glob($path . '*') as $path){ // search tree
$paths[] = path($path);
}
}
// ...

这可能会产生最好的结果。唯一 1 我能想到的解决方案是将 include() 调用包装在另一个匿名函数中以更改范围:

// ...
if(true === call_user_func(function() use($callback, $path){
return $callback($path);
})){
break;
}
// ...

从而保护 $path(,更重要的是,$callback)不会在每次迭代时产生副作用。

我想知道在这种情况下是否存在一种更简单的方法来“锁定”PHP 中的变量。

  1. 我只想在这里记录下来;我知道我可以使用,例如,elseif 来缓解此函数特有的问题之一,但是我的问题更感兴趣的是与环境无关的解决方案,如果你愿意的话,这是一个包罗万象的解决方案。

最佳答案

看看Giving PHP include()'d files parent variable scope它有一种相当独特的方法来解决可以在这里使用的问题。

这相当于在包含之前取消设置所有定义的变量,然后在之后重置它们。

它当然不优雅,但它会起作用。

关于php - 在 PHP 中保护来自 "include pollution"的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com