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中的“包含污染”变量相关推荐

  1. php父类的静态变量,抽象父类中的PHP静态变量:问题是在示例代码中!

    问题的快速代码包括: abstract class ClassParent { public static $var1 = "ClassParent"; } class Class ...

  2. php use 使用变量,php闭包中使用use声明变量的作用域实例分析

    本文实例讲述了php闭包中使用use声明变量的作用域.分享给大家供大家参考,具体如下: function getClosure($i) { $i = $i.'-'.date('H:i:s'); ret ...

  3. php中的变量函数,PHP中的一些路径变量或函数

    <?php /** __FILE__ , getcwd(), $_SERVER["REQUEST_URI"], $_SERVER["SCRIPT_NAME" ...

  4. php怎么配置环境变量,php环境变量配置_windows中配置PHP环境变量

    摘要 腾兴网为您分享:windows中配置PHP环境变量,中国天气,之了课堂,真还赚,永辉生活等软件知识,以及城市地摊财富秘籍,捆绑工具,golo技师盒子,作家登录,情侣绿钻,keepass,小一寸照 ...

  5. python怎么输入给变量赋值_python中如何给input变量赋值

    python中如何给input变量赋值 发布时间:2020-11-13 10:07:40 来源:亿速云 阅读:94 作者:小新 了解python中如何给input变量赋值?这个问题可能是我们日常学习或 ...

  6. linux中hadoop环境变量配置文件,Ubuntu中关于hadoop环境变量的设置方法

    Ubuntu搭建hadoop时,在/bin./sbin等路径下有一些经常使用的工具. 为了能够在任何路径下都能使用这些工具,而不必切换到bin/sbin路径下,需要设置hadoop的环境变量(注意:前 ...

  7. matlab自动变量名,matlab中如何自动给变量命名?

    在大量数据处理中,如果单独给变量命名,无疑是一项简单.费时.重复性工作.matlab通过eval函数提供了自动命名变量的功能,见下面的例子: %%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  8. shell中如何判断一个变量是否为空

    shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 #!/ ...

  9. 谈谈你对c语言中数据(各种常量,变量,函数参数,字符串)的存储认识,自考《高级语言程序设计》知识点总结(二)...

    2.1 C语言的数据类型 数据类型包含两方面的内容:数据的表示和对数据加工的操作.数据的全部可能表示构成数据类型的值的集合.数据全部合理的操作构成数据类型的操作集合. 在C语言中,把整型.实型和字符型 ...

最新文章

  1. Windwos 08R2_DNS全面图文详解
  2. Java 11将于本月25日发布,新特性一览
  3. Windows/Linux高精度计时器(C++)
  4. C++--day06
  5. 推荐JQuery学习简介
  6. 从位图数据取得位图句柄
  7. LeetCode | 我的LeetCode之旅(持续更新ing)
  8. tcp通讯 怎么进行安全认证_西门子PLC在博图环境下进行TCP通讯详解
  9. python类方法_Python类方法
  10. 当攻击者采用新型逃避技术——“域遮蔽” 企业该如何应对?
  11. 【wikioi】1014 装箱问题
  12. cacti mysql版本,cacti迁移+升级版本
  13. Linux网络编程 | UDP编程
  14. mt7620 eeprom 小米_小米CC9 Pro搭载1亿像素传感器,新款手表引关注;谷歌称微信软件性能太差;iPhone明年或配备120Hz屏幕...
  15. 《云计算安全体系》之虚拟化安全读后总结
  16. 知识图谱应用在金融行业的地方
  17. #49:Photoshop技巧的大杂烩
  18. 公钥和私钥的区别与应用-----到底谁来加密谁来解密
  19. ESXI 通过naa在主机上找到物理磁盘的位置
  20. Android-jni(10)-jni调用java父类方法

热门文章

  1. ansible安装及使用
  2. 对css float 浮动的学习心得
  3. 【转】RMAN 高级恢复
  4. 软件测试工程师笔试试题
  5. Python学习笔记: Python 标准库概览
  6. Keras学习笔记:序列式模型
  7. 转载:matlab 字符串和变量名互换
  8. STM32之的GPIO推挽输出与开漏输出的区别
  9. 神经网络训练细节之batch normalization
  10. [云炬创业管理笔记]第6章制定创业行动测试4