7

我有一个在多个站点上使用的程序。它使用 require('config.php'); 设置任何站点相关变量,如 mysql 连接信息、路径等。

假设我在函数中使用这些站点相关变量之一,例如$backup_path

这个变量最初是在 config.php 中声明的,并没有出现在主程序文件中。

我需要在函数makebackup($table_name);中访问这个变量 (也在一个单独的functions.php文件中)。

是不是更好说

makebackup('my_table');

然后在函数内部使用“global $backup_path” ,或者使用调用函数更好

makebackup('my_table',$backup_path);

第一个的论点是它使主程序流程简单易懂,没有混乱。

第二个论点是,经过一段时间后,变量 $backup_path 的存在可能并不明显,调试或返工可能很困难。

这些技术中的一种或另一种在专业程序员中是“标准的”吗?或者我应该使用$_SESSION来声明这些全局变量?

4

7 回答 7

5

第二种选择,

makebackup('my_table', $backup_path);

是可重用的功能,因此通常更可取。额外的参数并不是可重用性的大代价。

如果您完全确定您将只在该特定应用程序中使用该功能,并且仅用于 $backup_path,那么也许考虑全局替代方案。即使这样,检查全局变量是否确实存在也是很好的。请注意,一旦开始使用全局变量,就很难摆脱它们。

于 2009-09-18T09:29:59.323 回答
1

我认为您必须为此使用 Singleton of Factory 类配置。

函数 makebackup($table)
{
   $backup_path = ConfigFactory().getConfig($some_site_specific_data).getBackupPath()
   mysqldump($table, $backup_path)
}
于 2009-09-18T09:23:34.097 回答
1

传递引用更容易测试(您可以提供模拟配置对象)。全球人更少。您可以断言该方法上的引用不为空。我称之为可测试性最佳实践。

于 2009-09-18T09:29:35.247 回答
1

请记住,您可以为函数设置默认值:

function makebackup($table, $dir = CONFIG_BACKUP_PATH)

这样您就不必在默认情况下提供变量,您可以简单地假设配置的备份路径是默认的。

这假设您使用的是常量,而不是全局变量。

于 2009-09-18T09:58:17.363 回答
1

标记该全局变量

就个人而言,我也非常清楚地标记了全局变量。如果我必须使用它们,我想清楚它们。

所以在这里,我将重命名$backup_path$GLOBAL_backup_path. 每次看到它,我就知道要小心。

于 2009-09-18T10:01:12.803 回答
1

另一种选择是使用带有 define() 的 php 常量。

您的 config.php 将为每个参数(mysql 连接、css 样式、wathever)设置常量。然后你不需要将变量传递给函数,也不需要使用全局变量。

一个缺点是您只能定义布尔值、浮点数、字符串或整数,不能定义复杂的数据结构。

于 2009-09-18T10:40:14.877 回答
0

不确定是否真的有“正确”的方法可以做到这一点,但另一种选择是这样的:

function makebackup($table, $backup_path = '') {
    if ( $backup_path == '' ) {
        if ( isset($GLOBALS['backup_path']) ) {
            $backup_path = $GLOBALS['backup_path'];
        }
        else {
            die('No backup path provided');
        }
    }
 }

这样,您可以传入该值(用于测试和将来使用),或者如果您不传入该值,则该函数将查找可能的全局变量。

于 2009-09-18T10:06:56.177 回答