2012-10-01 92 views
0

奇怪的請求,我使用配置管理器功能要求配置文件,以便我們只加載所需的變量,而不是數百的設置。要求功能不可訪問功能外

問題是,其中一個文件有一個類和變量集,現在它們包含在內,但不能從主腳本訪問它們。

的函數加載該文件是:

function load($OPT){ 
     if (file_exists(ABSPATH. "includes/config/".$OPT.".config.php")){ 
      require_once(ABSPATH. "includes/config/".$OPT.".config.php"); 
     } else { 
      echo "Missing configuration script ".$OPT.", application has been halted."; 
      exit(); 
     } 
    } 

我也試圖通過同一問題

​​

的文件,它包括將有這樣的代碼做到這一點的一類,但凸輪下面

define('COMPANYNAME', 'NAME'); 
define("IPADDRESS", $_SERVER['REMOTE_ADDR']); // IP Address of accessing user 
require_once (ABSPATH . 'includes/classes/mysql.class.php'); // class to manage the database 
$DB = new sqlClass; 
var_dump($DB); 

現在的var_dump在按預期上面的代碼輸出,但是如果喲你做了如下所示的var_dump,它返回null!

require_once (ABSPATH . 'includes/functions/_configmanager.php'); // Class to manage the configuration of the site. 
loadconfig("global"); 
var_dump($DB); 

任何人有任何想法如何實現這一目標?

+0

所以你有一個函數,像一個自動加載器,除了加載配置指令。你在一個函數中加載它,但你希望能夠在全局訪問它們。你的解決方案應該很簡單:使用一個類來獲取配置指令。使用自動加載器來包含擴展基本配置類的相應配置類。你所要做的就是像'CFGClass :: get('variable name');'或'$ cfg-> get('variable name')'這樣的操作,這取決於你使用的方法。這當然只是一個簡單的例子。 –

+0

@ N.B。對不起,我沒有按照示例 – Neo

+0

該示例說明不要將文件包含到函數中,請使用類來處理配置變量。不要使用'define('variable','value')'因爲你不能在函數中定義常量和變量,並期望它們在任何地方都能工作。使用1類使用PHP的自動加載函數加載子類,並使用該類來獲取變量值。該課程可以在任何地方訪問,而且不會污染全球範圍。 –

回答

0

變量的範圍是其定義的上下文。大多數情況下,所有PHP變量只有一個範圍。這個單一的範圍跨越了包含和必需的文件。

1

我不喜歡這種配置方案。但是,有一個解決方案。 如前所述,範圍在函數內部。您可以使用global使變量對外可見。

例子:

global $DB; 
require_once('configManager.php'); 
loadcfg('global'); 

global.cfg.php:

global $DB; 
$DB = mysql_connect(...); 

這將確保,即$DB作爲全局變量,而不是本地處理。

但是!儘量不要使全局變量。想想另一種解決方案。例如,僅配置基於環境的參數,而不是整個對象的創建。如果你在其他地方這樣做,你可以避免globals,並使你的代碼更具可讀性和簡單性。

+0

我也很討厭全局變量,但它看起來像是它唯一的方法。不確定你的意思是「僅配置基於環境的參數」 – Neo

+1

配置文件有何不同?我認爲它的參數是主機,用戶,密碼等。你可以只將它們放入cfg文件中,並在'main'代碼中創建對象。例如:configMan在構造函數'$ cfgMan = new ConfigManager('local')'中加載配置。然後,您可以將cfg值存儲在對象參數中。比你可以獲得DB對象的fce,它看起來像'$ cfgMan-> db()'。 CfgMan將根據從cfg文件接收到的參數爲DB創建實例。 – macino