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算法学习之动态