2011-03-07 49 views
0

不知道爲什麼我不能通過調用包含文件然後引用該數組的函數來修改數組。通過包含文件和函數訪問和修改數組

這裏的情況是:

的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"; 

不知道爲什麼我無法修改check_if_local_file_exists函數包含的包含文件config.local中的$ db數組。

當我調用config.php中的check_if_local_file_exists(FILE)後,print_r($ db)根本沒有修改$ db數組。 。 。

+0

爲什麼你添加@來抑制錯誤?可能會有警告說文件不能包含在內。也許嘗試一個要求。 – Jacob 2011-03-07 03:12:29

+0

你確定你的config.local被包含在內嗎? – Jacob 2011-03-07 03:15:39

+0

我刪除了@來抑制錯誤。你是對的,不需要它。我已經得出結論,config.local正在被包括在內。全局聲明之後的var_dump不會產生任何內容,從而確認這是範圍問題。 。 .my懷疑是因爲config.php包含在類或函數本身中。 – rciiipo 2011-03-07 03:57:00

回答

0

你必須加載文件。初始加載後,Php不會被重新修復。儘量不要使用檢查功能,直接將文件包含在測試中,看看它是否適合你。另外,嘗試

return @include(....); 

,而不是僅僅

@include(....); 
+0

關於何時可以在PHP中包含文件沒有限制,您是否有任何對該語句的引用? – Jacob 2011-03-07 03:13:49

+0

@Jacob我的意思是說他沒有從函數本身返回任何東西,所以它不解析它。 – 2011-03-07 03:17:22

+0

退貨也不是必需的。該函數不會返回任何內容,包含的文件正在修改全局變量。 – Jacob 2011-03-07 03:20:16

0

在包括呼叫前你不應該使用@。它可能隱藏重要的調試信息。

在全局範圍中創建的config.php中的$ db變量是什麼?那是你告訴我們的線不在一個函數內或函數包含的文件中?

您確認文件正在包含嗎?這可以像迴應「我已經加入!」一樣簡單。如果文件已經包含,請在全局聲明後但在修改它之前嘗試var_dump($db);,並確保您正在訪問正確的變量(這也將回答有關範圍的問題)。

我懷疑這個文件可能沒有被包含,並且你沒有因爲@符號而被警告,或者如果這個文件不存在,它什麼也不做。

0

在所有的情況下,我沒有看到一個調試語句,例如,

其他回聲「文件不存在」;

你怎麼知道文件是否存在於你說的地方? 使用include(....)時,不要進行所有這些檢查,然後使用superessor操作符。浪費了很多時間和資源。 使用一個。最有可能的是,條件檢查,因爲抑制速度較慢,並在那裏添加一些調試信息。

如果它是一個配置文件,爲什麼使它可選?我寧願使用包含。配置是必不可少的。

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


那麼在你的測試中,值是不同的?如果是的話,它應該工作。 如果您要修改函數外部的數組,請嘗試刪除全局聲明。 在包含的文件中嘗試一個簡單的回聲來查看它是否執行。 最後,用.php擴展名重命名該文件,然後重試。


嘗試包裝你的代碼在PHP標籤的包含文件中。 如果您事先知道您正在修改哪個變量,那麼在包含該文件之前作爲全局聲明。這應該解決它。

+0

我已經確認該文件存在並且該函數正在被調用。 check_if_local_file_exists函數只是檢查本地文件是否存在,然後使用該本地文件覆蓋潛在的配置變量。這爲我們的團隊在Subversion中工作提供了一種簡單的方法,只需將文件(如「database.local」或「c​​onfig.local」)添加到與調用上述函數的文件相同的目錄即可。如果我刪除了該函數,並將該函數的主體放在config.php中,我可以使所有的工作都能正常工作 – rciiipo 2011-03-07 03:48:42