php 保护变量,保护PHP中的“包含污染”变量
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来缓解这个函数特有的问题之一,但是我的问题是对环境无关的解决方案更感兴趣,如果你愿意的话,这是一个全能的问题.
php 保护变量,保护PHP中的“包含污染”变量相关推荐
- php父类的静态变量,抽象父类中的PHP静态变量:问题是在示例代码中!
问题的快速代码包括: abstract class ClassParent { public static $var1 = "ClassParent"; } class Class ...
- php use 使用变量,php闭包中使用use声明变量的作用域实例分析
本文实例讲述了php闭包中使用use声明变量的作用域.分享给大家供大家参考,具体如下: function getClosure($i) { $i = $i.'-'.date('H:i:s'); ret ...
- php中的变量函数,PHP中的一些路径变量或函数
<?php /** __FILE__ , getcwd(), $_SERVER["REQUEST_URI"], $_SERVER["SCRIPT_NAME" ...
- php怎么配置环境变量,php环境变量配置_windows中配置PHP环境变量
摘要 腾兴网为您分享:windows中配置PHP环境变量,中国天气,之了课堂,真还赚,永辉生活等软件知识,以及城市地摊财富秘籍,捆绑工具,golo技师盒子,作家登录,情侣绿钻,keepass,小一寸照 ...
- python怎么输入给变量赋值_python中如何给input变量赋值
python中如何给input变量赋值 发布时间:2020-11-13 10:07:40 来源:亿速云 阅读:94 作者:小新 了解python中如何给input变量赋值?这个问题可能是我们日常学习或 ...
- linux中hadoop环境变量配置文件,Ubuntu中关于hadoop环境变量的设置方法
Ubuntu搭建hadoop时,在/bin./sbin等路径下有一些经常使用的工具. 为了能够在任何路径下都能使用这些工具,而不必切换到bin/sbin路径下,需要设置hadoop的环境变量(注意:前 ...
- matlab自动变量名,matlab中如何自动给变量命名?
在大量数据处理中,如果单独给变量命名,无疑是一项简单.费时.重复性工作.matlab通过eval函数提供了自动命名变量的功能,见下面的例子: %%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- shell中如何判断一个变量是否为空
shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 #!/ ...
- 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...
2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...
最新文章
- Windwos 08R2_DNS全面图文详解
- Java 11将于本月25日发布,新特性一览
- Windows/Linux高精度计时器(C++)
- C++--day06
- 推荐JQuery学习简介
- 从位图数据取得位图句柄
- LeetCode | 我的LeetCode之旅(持续更新ing)
- tcp通讯 怎么进行安全认证_西门子PLC在博图环境下进行TCP通讯详解
- python类方法_Python类方法
- 当攻击者采用新型逃避技术——“域遮蔽” 企业该如何应对?
- 【wikioi】1014 装箱问题
- cacti mysql版本,cacti迁移+升级版本
- Linux网络编程 | UDP编程
- mt7620 eeprom 小米_小米CC9 Pro搭载1亿像素传感器,新款手表引关注;谷歌称微信软件性能太差;iPhone明年或配备120Hz屏幕...
- 《云计算安全体系》之虚拟化安全读后总结
- 知识图谱应用在金融行业的地方
- #49:Photoshop技巧的大杂烩
- 公钥和私钥的区别与应用-----到底谁来加密谁来解密
- ESXI 通过naa在主机上找到物理磁盘的位置
- Android-jni(10)-jni调用java父类方法