php 保护变量,保护PHP中的“包含污染”变量

博客讨论了如何在PHP中避免在include()调用时因变量污染导致的问题。提出了一个问题,即当包含的文件中包含变量定义时,如何保护全局或局部变量不被修改。给出的例子展示了如何通过在include()周围创建一个新的作用域来解决这个问题。解决方案包括使用匿名函数来限制变量的影响范围。文章寻求一种更优雅的方法来锁定PHP中的变量,以防止意外的副作用。
摘要由CSDN通过智能技术生成

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来缓解这个函数特有的问题之一,但是我的问题是对环境无关的解决方案更感兴趣,如果你愿意的话,这是一个全能的问题.

解决方法:

它等于在include之前取消所有已定义的变量,然后在之后重置它们.

它肯定不优雅,但它会起作用.

标签:php,scope,include,return,locking

来源: https://codeday.me/bug/20190704/1378780.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值