¿Puedo hacer que una variable sea visible globalmente sin tener que declararla global en cada constructor de clases PHP?

StackOverflow https://stackoverflow.com/questions/1234445

Pregunta

Tengo una clase de base de datos, que una instancia se declara en el index.php principal como

$db = new Database();

¿Hay alguna manera de que la variable $ db sea reconocida globalmente en todas las demás clases sin tener que declarar

global $db;

en el constructor de cada clase?

¿Fue útil?

Solución

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 usar una clase estática para envolverla, llamada Método Singleton (Consulte Aquí 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 solo hubiera una instancia de cualquier clase. Pero, debido a que la gente lo usa como una forma de atajar el globo, se conoce como programación perezosa / mala.

Conocimiento de StackOverflow
Cómo evitar el uso de objetos globales PHP
Compartir variables entre funciones en PHP sin usar Globals < br> Cómo hacer que una variable global sea accesible para cada función dentro de una clase
Global o Singleton para conexión de base de datos

Otros consejos

Lo hago un poco diferente. Por lo general, tengo un objeto de aplicación global (aplicación). Dentro de ese objeto hago una inicialización básica como crear mis objetos db, guardar objetos en caché, etc.

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

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

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

Entonces, puedo usar algo como lo siguiente en cualquier parte de 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 creo que facilita las cosas en muchas circunstancias.

podrías usar

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

o alternativamente usando algún tipo de método de acceso único

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

¿Por qué no crear una clase que contenga el global $ db; en su constructor, y luego extender todas las demás clases a partir de esto?

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

class Registry
{
    protected static 

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

<*>data = array(); public static function set($key, $value) { self::

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

<*>data[$key] = $value; } public static function get($key, $default = null) { if (array_key_exists($key, self::

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

<*>data)) { return self::

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

<*>data[$key]; } return $default; } } Registry::set('db', new Database()); $db = Registry::get('db');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top