2009-08-05 8 views
6

que tienen una clase de base de datos, que se declara una instancia en el principal index.php como¿Puedo hacer una variable globalmente visible sin tener que declararla global en el constructor de cada clase de PHP?

$db = new Database(); 

¿Hay alguna forma para la variable $db a ser reconocido a nivel mundial en todas las demás clases sin tener que declarar

global $db; 

en el constructor de cada clase?

+0

¿Realmente lo necesita para TODAS las otras clases? –

+0

No todo, pero una cantidad significativa. –

Respuesta

16

No. Debe declarar Global $ db en el constructor de cada clase.

o puede usar la matriz Global: $ _GLOBALS ['vars'];

La única forma de evitar esto es utilizar una clase estática para envolverlo, llamada Singleton Method (Consulte Here para obtener una explicación). Pero esta es una muy mala práctica.

class myClass 
    { 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     else 
     { 
      return self::$class; 
     } 
    } 
    // Then create regular class functions. 
    } 

El método singleton se creó para asegurarse de que había solo una instancia de cualquier clase. Pero, como la gente lo usa como una forma de atajar el globalling, se lo conoce como programación floja/mala.

Stackoverflow Conocimiento
How to Avoid Using PHP Global Objects
Share Variables Between Functions in PHP Without Using Globals
Making a Global Variable Accessible For Every Function inside a Class
Global or Singleton for Database Connection

+0

¿Por qué el voto a favor? –

+0

Estoy volviendo loco diciendo que el método de Singleton no era la respuesta correcta para esto. Pero lo incluí porque se puede usar "técnicamente". –

+0

No era el voto negativo, gracias por avisarme. Quiero evitar las malas prácticas. –

1

podría utilizar

$GLOBALS['db']->doStuff(); 

o, alternativamente, utilizando algún tipo de método de acceso Singleton

Database::getInstance()->doStuff(); 
+0

¿Alguno de esos métodos es una mala práctica? ¿Es la mejor práctica declarar la clase de base de datos como global dentro de cada clase? –

0

Puede usar una clase Registry para almacenar y recuperar su instancia Database.

class Registry 
{ 
    protected static $_data = array(); 

    public static function set($key, $value) 
    { 
     self::$_data[$key] = $value; 
    } 

    public static function get($key, $default = null) 
    { 
     if (array_key_exists($key, self::$_data)) { 
      return self::$_data[$key]; 
     } 

     return $default; 
    } 
} 

Registry::set('db', new Database()); 
$db = Registry::get('db'); 
+0

Eso es básicamente una clase singleton para datos .... –

+0

así es $ GLOBALS ... –

+0

Excepto '$ GLOBALS' y la palabra clave' global' están incorporadas en el lenguaje, y por lo tanto son rápidas y conocidas por todos. Su clase de registro no lo es, y no agrega ninguna funcionalidad adicional. Algún tipo de clase 'Opciones' podría ser útil para almacenar las opciones de la aplicación, pero incluso eso probablemente podría ser reemplazado por una matriz asociativa. –

1

por qué no crear una clase que contiene el global $db; en ella del constructor, a continuación, se extienden todas las demás clases de esto?

2

Lo hago un poco diferente. Normalmente tengo un objeto de aplicación global (aplicación). Dentro de ese objeto que hago un poco de inicialización básica como la creación de objetos de mi db, almacenamiento en caché de objetos, etc.

también tengo una función global que devuelve el objeto App .... por lo tanto (definición del objeto de aplicación no se muestra):

define('APPLICATION_ID', 'myApplication'); 

${APPLICATION_ID} = new App; 

function app() { 
    return $GLOBALS[APPLICATION_ID]; 
} 

Así entonces puedo usar algo como lo siguiente en cualquier lugar en cualquier código para hacer referencia a objetos dentro del objeto global:

app()->db->read($statement); 
app()->cache->get($cacheKey); 
app()->debug->set($message); 
app()->user->getInfo(); 

no es perfecto, pero me parece que para facilitar las cosas en muchas circunstancias.

Cuestiones relacionadas