2011-05-11 16 views
6

¿Hay alguna posibilidad de crear un archivo de configuración con variables globales que sean visibles dentro de la clase? Algo similar a esto:¿Cómo crear un archivo de configuración global?

config.php:

$config['host_address'] = 'localhost'; 
$config['username '] = 'root'; 
$config['password'] = 'root'; 
$config['name'] = 'data'; 

db.php:

include('config.php'); 
class DB 
{ 
    private $_config = array($config['host_address'], $config['username'], $config['password'], $config['name']); 
    ... 

propiedad actual:

private $ _config = array(); 

No quiero transmitir a través de la constructor a mi conector de base de datos Singleton:

DB::getInstance(array('localhost', 'root', 'root', 'data')); 

Respuesta

4

Su problema es que usted está tratando de utilizar un expresión en la definición de clase aquí:

class DB 
{ 
    private $_config = array($config['host_address'], ... 

Eso es sintácticamente incorrecto (puede en utilizo valores constantes para eso), y no esperaría que encuentre allí el alcance previsto. Lo que debe hacer en su lugar es inicializar esta propiedad en el lugar Constructor:

class DB 
{ 
    private $_config; 

    function __construct() { 
     global $config; 
     $this->_config = array($config['host_address'], $config['username'], $config['password'], $config['name']); 
    } 

O incluso más perezoso, sólo tiene que utilizar include('config.php'); en lugar de la global $config alias. De esta forma, su script de configuración extraerá $ config como variable local dentro del constructor, que es todo lo que necesita.

+0

+ 1 Correctamundo! – webbiedave

0

Usted podría intentar define:

define('host_address', 'root'); 
define('username', 'root'); 

`Uso:

DB::getInstance(array(host_address, username, ...)); 
+0

@rad F Jacobs No es la mejor opción, pero no todos tenemos el acceso necesario para poner nuestro archivo de configuración fuera de la raíz web. –

+0

@Brad F Jacobs da como ejemplo a prueba o no sucedió – Andrew

11

Todos tienen sus propias preferencias. Prefiero almacenar mi configuración de base de datos en .ini fuera de la webroot y luego darle un valor de 0600 chmod, para evitar que nadie más que el propietario lo lea.

Un ejemplo .ini será parecida:

[database] 
driver = mysql 
host = localhost 
;port = 3306 
schema = yourdbname 
username = dbusername 
password = some_pass 

continuación, puede utilizar la función de php parse_ini_file entonces en su constructor que acaba de leer que en analizar y en una matriz:

public function __construct($file = 'dbsettings.ini') 
{ 
    // @todo: change this path to be consistent with outside your webroot 
    $file = '../' . $file; 

    if (!$settings = parse_ini_file($file, TRUE)) throw new exception('Unable to open ' . $file . '.'); 

    $dns = $settings['database']['driver'] . 
    ':host=' . $settings['database']['host'] . 
    ((!empty($settings['database']['port'])) ? (';port=' . $settings['database']['port']) : '') . 
    ';dbname=' . $settings['database']['schema']; 

    // if not PDO, this part needs to be changed parent::__construct($dns, $settings['database']['username'], $settings['database']['password']); 
} 

Y viola, tiene una manera simple y segura de configurar su conexión a la base de datos. Esta clase fue tomada de una clase de extensión PDO, por lo que si no está usando PDO necesita cambiar esa línea, pero como puede ver, obtiene el nombre de usuario, etc. en una matriz $settings.

Me gustaría evitar ALMACENAMENTE almacenar cualquier tipo de información de base de datos en una variable de tipo CONSTANT o GLOBAL. De esta forma, el $settings solo está disponible para esa función de clase y nada más, lo que proporciona un poco más de capa de seguridad.

Cuestiones relacionadas