1

我的 php 代码中需要一个文件。这要求在代码中存在两次。

require 'test.php';

echo $result;

require 'test.php';

有没有办法在完全相同的文件上运行第二个要求之前清除第一个要求设置的所有变量?

4

4 回答 4

1

如果您在要求的开头声明所有变量,例如:

$var = false;
$var2 = 0;
$var3 = '';
// etc...

除了再次要求文件之外,您无需做任何事情 - 这些声明将自动将变量重置为初始状态。

话虽如此,您正在寻找一种不同的方法。根据您需要如何使用它,将该功能封装到一个函数或一个类中。基本上,如果您有一些代码在整个代码库中重复,您应该对其进行模块化,并且绝对不会使用仅用于该中间功能所需的变量来污染全局范围。

于 2012-09-11T16:13:13.007 回答
1

require如果您不使用全局变量,则可以将其包装在一个函数中。在这种情况下,您创建的所有变量都将被限制在函数范围内。

function includeFile() {
    require 'test.php';
    echo $result;
}

includeFile();

includeFile();

但是按照评论中的建议创建一个类会更好。

于 2012-09-11T16:13:27.470 回答
0

你可以做两件事。 unset()将删除所有这些变量。这回答了你的问题。

您应该做的是研究 OOP 和类。创建一个类,然后创建该类的一个实例。然后,您可以创建一个新类并拥有完全不同的值和数据,最终不再需unset()要这样做require

于 2012-09-11T16:15:04.847 回答
0

我没有测试这段代码!

要点是在包含之前获取已定义变量的列表,包含文件,在包含后获取已定义变量的列表,计算差异,根据该差异取消设置全局变量,包含文件。

get_defined_vars请参阅和上的手册条目unset

<?php

$old_vars = get_defined_vars();

require 'test.php';

$new_vars = get_defined_vars();

echo $result;

$diff_vars = array_diff_key($old_vars, $new_vars);
while ($var = key($diff_vars)) {
    unset($GLOBALS[$var]);
    next($diff_vars);
}
unset($old_vars, $new_vars, $diff_vars);

require 'test.php';

说得通?

于 2012-09-11T16:17:49.480 回答