通过包含文件和函数访问和修改数组

时间:2011-03-07 03:06:32

标签: php

不知道为什么我不能通过调用包含引用该数组的文件的函数来修改数组。

情况如下:

的config.php:

$db['default']['password'] = "password";  
$db['default']['database'] = "dbname";

check_if_local_file_exists(__FILE__);

function check_if_local_file_exists( $calling_file )  
{
   $local_version = dirname( $calling_file ) . '/' . basename( $calling_file , '.php' ) . '.local';

   if ( file_exists ( $local_version ) ) {    
     @include_once( $local_version );  
   }  

} // function

config.local:

global $db;

$db['default']['password'] = "password_modififed";  
$db['default']['database'] = "dbname_modified";

我不知道为什么我不能修改包含文件中的$ db数组:check_if_local_file_exists函数包含的config.local。

当我在config.php中调用check_if_local_file_exists( FILE )后打印__($ db)时,$ db数组根本没有被修改过。 。

3 个答案:

答案 0 :(得分:0)

您必须在加载时包含该文件。初始加载后不会重新分析Php。尝试不使用检查功能,只需将文件直接包含在测试中,看看它是否适合您。另外,试试

return @include(....);

而不仅仅是

@include(....);

答案 1 :(得分:0)

您不应在include调用前使用@。它可能隐藏重要的调试信息。

config.php中的$ db变量是否在全局范围内创建?那就是你向我们展示的行不在函数内或函数包含的文件中?

您是否确认该文件包含在内?这可以简单到回应“我被包括在内!”在config.local

此外,如果已包含该文件,请在全局声明后但在修改之前尝试var_dump($db);,并确保您正在访问正确的变量(这也将回答有关范围的问题)。

我怀疑文件可能没有被包含在内,因为@符号没有被警告,或者如果文件不存在则不会被警告。

答案 2 :(得分:0)

在所有情况下,我都没有看到单个调试语句,例如

否则echo'文件不存在';

您如何知道文件是否存在于您所说的位置? 使用include(....)时,不要进行所有这些检查,然后使用superessor运算符。浪费了太多的时间和资源。 用一个。最有可能的是,条件检查因为抑制速度较慢并且在那里添加了一些调试信息。

如果是配置文件,为什么要选择它?我宁愿使用包含。配置是必不可少的。

此外,config local中的值在您的示例中是相同的。不应该有任何修改。


所以在你的测试中,价值是否不同?如果是,它应该工作。 如果要在函数外部修改数组,请尝试删除全局声明。 在包含的文件中尝试一个简单的回显来查看它是否执行。 最后,使用.php扩展名重命名该文件,然后重试。


尝试将代码包装在include文件中的php标记中。 如果您事先知道要修改哪个变量,则在包含该文件之前成为全局语句。那应该解决它。