Posso fazer uma variável global é visível sem ter de declarar global de ti em cada PHP construtor da classe?

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

Pergunta

Eu tenho um banco de dados de classe, que uma instância é declarada o principal index.php como

$db = new Database();

Existe um caminho para a $db a variável a ser reconhecida globalmente em todas as outras classes sem ter de declarar

global $db;

no construtor de cada classe?

Foi útil?

Solução

Não.Você tem que declarar Global $db no construtor de cada classe.

ou você pode usar a matriz Global:$_GLOBALS['vars'];

A única maneira de contornar esse problema é usar uma classe estática para envolvê-lo, o chamado Método Singleton (Ver Aqui para uma explicação).Mas isso é muito ruim prática.

  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.
   }

O singleton método foi criado para se certificar de que não era apenas uma instância de qualquer classe.Mas, porque as pessoas a usam como uma forma de atalho globalling, torna-se conhecido como preguiçoso ou ruim de programação.

StackOverflow Conhecimento
Como Evitar o Uso de PHP Objetos Globais
Compartilhar Variáveis Entre Funções em PHP Sem Usar variáveis Globais
Fazendo uma Variável Global Acessível Para Cada Função dentro de uma Classe
Global ou Singleton para Conexão de Banco de dados

Outras dicas

Eu faço isso um pouco diferente. Eu geralmente tenho um objeto de aplicativo global (APP). Dentro desse objeto, faço alguma inicialização básica, como criar meus objetos de banco de dados, objetos de cache, etc.

Eu também tenho uma função global que retorna o objeto do aplicativo .... Assim (definição de objeto de aplicativo não mostrado):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

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

Então, posso usar algo como o seguinte em qualquer lugar de qualquer código para referenciar objetos do objeto global:

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

Não é perfeito, mas acho que facilita as coisas em muitas circunstâncias.

você poderia usar

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

ou alternativamente usando algum tipo de método de acesso singleton

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

Por que não criar uma classe que contém o global $db; No construtor, estende todas as outras classes disso?

Você poderia usar um Registry classe para armazenar e recuperar seu Database instância.

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');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top