首页 / PHP / 保护PHP中的“包含污染”变量
保护PHP中的“包含污染”变量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了保护PHP中的“包含污染”变量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2596字,纯文字阅读大概需要4分钟。
内容图文
![保护PHP中的“包含污染”变量](/upload/InfoBanner/zyjiaocheng/776/93228454d0b248b88748fabf5ff1fdea.jpg)
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);
}
}
// ...
这可能会产生糟糕的结果.我能想到的唯一的700001解决方案是将include()调用包装在另一个匿名函数中以改变范围:
// ...
if(true === call_user_func(function() use($callback, $path){
return $callback($path);
})){
break;
}
// ...
因此,保护??$path(更重要的是,$callback)不会导致每次迭代产生副作用.
我想知道在这种情况下是否存在一种更简单的方法来“锁定”PHP中的变量.
>我只想在这里记录;我知道我可以使用例如一个elseif来缓解这个函数特有的问题之一,但是我的问题是对环境无关的解决方案更感兴趣,如果你愿意的话,这是一个全能的问题.
解决方法:
看看Giving PHP include()’d files parent variable scope它有一个相当独特的方法来解决这里可以使用的问题.
它等于在include之前取消所有已定义的变量,然后在之后重置它们.
它肯定不优雅,但它会起作用.
内容总结
以上是互联网集市为您收集整理的保护PHP中的“包含污染”变量全部内容,希望文章能够帮你解决保护PHP中的“包含污染”变量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。