- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
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);
}
}
// ...
这可能会产生最好的结果。唯一 1 我能想到的解决方案是将 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它有一种相当独特的方法来解决可以在这里使用的问题。
这相当于在包含之前取消设置所有定义的变量,然后在之后重置它们。
它当然不优雅,但它会起作用。
关于php - 在 PHP 中保护来自 "include pollution"的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016536/
好的,我有一个名为 Window 的类,它旨在满足将窗口组合在一起的所有要求,而且效果非常好。我唯一的问题是我包含 window.h 的任何文件也包含所有窗口。我已经将所有特定于 Windows 的元
考虑这两个脚本: envSetter.sh: #!/bin/bash export ENV_VAR=6 return 3 sourceable.sh: #!/bin/bash function mai
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
在 ruby 中,一些 gems 选择“污染全局命名空间”。 这是什么意思? 我如何才能看到它发生在哪里? 为什么 gem 需要这样做? 当面对污染全局命名空间和冲突的两个 gem 时,当我选择“
我想为要在给定模块中重用的构造函数定义一个类型别名,而不必在它们定义的模块的路径前面加上前缀。我还想通过执行 open 来避免“污染”后一个模块/include这将导入太多定义。 这是我想要的示例(无
我的测试是这样的: const aframeViewer = new VRMaker.AframeViewer() let el let panoramas let panorama beforeEa
我是 Angular.js 的新手,我读到 Controller 不应该污染全局命名空间。 这到底是什么意思 以及为什么 angular.module('SomeApp',[]).controller
我正在考虑在一个新网站中使用 React,但我仍然想知道如何使用 React 组件处理全局命名空间。例如,如果我像这样定义几个 React 组件: var MySlider = React.creat
我想尽可能地限制 AngularJS 应用程序中的“闪烁”。我使用 resolve: from the router (与 ngRouter 和 ui-router 一起使用)加载数据,以便在更改路由
背景 在 JavaScript 中导入模块时,我们会用导入的模块名称污染全局命名空间: foo.js export foo() {..}; export const bar = 3.14; index
tl;dr: 有没有一种方法可以防止更改(本质上锁定)在 include() 之前声明/定义的变量通过包含的文件调用?另外,有点相关question . 我想知道可以采取什么措施来避免包含文件的变量污
我在 React Native 中有一个应用程序,当我运行 npm install 时,我收到此错误“在 1182 个扫描包中发现 15 个漏洞(5 个中等,10 个高)”。运行 npm audit
我正在使用这样的抽象类: @SpringBootTest(classes = MyAppApplication.class, webEnvironment = WebEnvironment.RANDO
这有什么区别: Library1 = function () {}; Library1.prototype.myFunc = function (p) { function helper1(p
尝试绘制风向图,绘制速度和方向,浓度决定颜色。不幸的是,matplotlib 只支持两个变量。可以制作一个漂亮的散点图来显示我想要的内容,但不确定如何将它装箱,以便它像附件中的图像一样出现(Halli
facebook React 教程有以下代码和附注: // tutorial3.js var CommentBox = React.createClass({ render: function()
我重写了这个问题,因为它最初是用更简洁的代码示例发布的: 将具有完全可选分号的语言视为糖,即: ;;富; bar;;;;有效 foo bar foobar 有效 如果(+1); foo 在语义上与 i
我已经在切换 UIView 方面工作了一段时间,并且正在尝试一个基本的 UIView 切换,而不使用 UINavigationController。我研究了 UINavigationControlle
当我执行 npm audit 时,它给了我这个链接,说我必须在我的 NODEJS 应用程序中更新 lodash https://www.npmjs.com/advisories/782但我尝试了 np
我有一个 DataGrid .现在它绑定(bind)到 ObservableCollection在我的模型中很棒。 但是现在我要实现 a user-friendly way to add a new
我是一名优秀的程序员,十分优秀!