例如,我有这个功能:
function foo($whaaaat){
$var1 = 'a';
$a = 1;
$b = 2;
...
// here unset all variables defined above (including arguments)
require 'somefile.php';
}
那么,我可以在需求点之前取消设置所有这些变量吗?
显然没有在每个变量上手动调用unset,因为我自己想出了:)
是否有一些功能可以做到这一点?
答案 0 :(得分:8)
您可以将require
打包在anonymous function:
function foo($a){
$b = 2;
call_user_func(function() {
require 'somefile.php';
});
}
答案 1 :(得分:7)
假设这些函数内变量都没有被声明为全局变量,你可以试试像
这样的东西array_diff(get_defined_vars(), $GLOBALS)
获取局部变量的列表,然后遍历结果以取消设置它们。
答案 2 :(得分:4)
你可以这样做:
function require_noscope($filename)
{
// Required file cannot see variables from other function
require $filename;
}
function foo($whaaaat){
$var1 = 'a';
$a = 1;
$b = 2;
require_noscope('somefile.php');
}
答案 3 :(得分:2)
这可能有用(未经测试):
$allVars = get_defined_vars(); // Returns array of all defined variables
foreach ($allVars as $allVars) { unset($allVars); }
编辑:正如我所说,从未测试过,也从未使用过它,但它可以引导Alex走向正确的方向。
答案 4 :(得分:2)
这是一个解决方案:
echo('Before: ' . $test1 . '<br>');
$vars = array_keys(get_defined_vars());
foreach($vars as $var) {
if($var == 'GLOBALS' || $var == '_POST' || $var == '_GET' || $var == '_COOKIE' || $var == '_FILES' || $var == '_REQUEST' || $var == '_SERVER' || $var == '_ENV')
continue;
unset($$var);
}
echo('After: ' . $test1 . '<br>');
我的测试输出:
之前:在这里?
后:
答案 5 :(得分:1)
没有内置任何内容,但您可以使用get_defined_vars()函数获取所有已定义变量的数组,然后使用foreach循环取消设置它们。
,你可以用4行完成所有这些操作。$list_of_vars = array_diff(get_defined_vars(), $GLOBALS); // Was just get_defined_vars() before Marc B corrected me in his post.
foreach($list_of_vars as $var){
unset($var);
}
编辑:正如Marc B指出的那样,这也将取消你的$ GLOBAL变量。我编辑了我的示例,以展示如何正确获取变量列表。
答案 6 :(得分:1)
我同意Whetstone。 get_defined_vars()
非常适合“多重未设置”技巧。
下面的方法,取消设置所有变量。 除了在无名数组中找到的所有内容在foreach循环中。
foreach(get_defined_vars() as $k=>$y){
if( !in_array( $k,
array(
'myRequredVariableName1',
'myRequredVariableName2',
'_ENV',
'_SESSION',
'_COOKIE',
'HTTP_SESSION_VARS',
'HTTP_COOKIE_VARS'
)))
{ $$k=null; unset($$k);}
unset($y, $k);
}
// Check for leftovers
header('Content-type:text/plain; charset=utf-8');
var_export(get_defined_vars());
exit;
这些值实际上是没有'$'的变量名,其中变量变量unset($$k);
与REAL和已定义的变量匹配,如果存在,则销毁它。因此,通过这种方式,您可以完全控制系统剩余的内容。
注意 某些共享主机设置仅依赖于_SERVER超全局,因此根本不需要_ENV,HTTP_SESSION_VARS,HTTP_COOKIE_VARS。最有可能你总是希望保留_COOKIE和_SESSION,但不要_GET和_POST或_FILES。决定各不相同。在将此技巧放在您的生产环境之前,测试并查看您自己应该在数组中的内容。
答案 7 :(得分:0)
需要这个,这里现有的答案并没有多大帮助。以下是简短的,并且有效:
foreach(get_defined_vars() as $k => $v)
unset($$k);
unset($k, $v);
如果在此之后调用var_dump(get_defined_vars())
,您将获得一个空数组。
注意: 除非在全局范围内(问题不是,它在函数中),get_defined_vars
不会返回任何全局,所以不需要过滤或检查任何东西,只需取消设置。