Могу ли я сделать переменную глобально видимой без необходимости объявлять ее глобальной в каждом конструкторе класса PHP?

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

Вопрос

У меня есть класс базы данных, экземпляр которого объявлен в основном index.php как

$db = new Database();

Есть ли способ для $db переменная, которая будет глобально распознаваться во всех других классах без необходимости объявления

global $db;

в конструкторе каждого класса?

Это было полезно?

Решение

Нет.Вы должны объявить Global $db в конструкторе каждого класса.

или вы можете использовать глобальный массив:$_GLOBALS['вары'];

Единственный способ обойти это — использовать для его оболочки статический класс, называемый Синглтон-метод (Видеть Здесь для пояснения).Но это очень плохая практика.

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

Метод Singleton был создан для того, чтобы гарантировать наличие только одного экземпляра любого класса.Но поскольку люди используют его как способ сокращения глобальных функций, это становится известно как ленивое/плохое программирование.

Знания StackOverflow
Как избежать использования глобальных объектов PHP
Совместное использование переменных между функциями в PHP без использования глобальных переменных
Создание глобальной переменной, доступной для каждой функции внутри класса
Global или Singleton для подключения к базе данных

Другие советы

Я делаю это немного по-другому. У меня обычно есть глобальный объект приложения (App). Внутри этого объекта я делаю некоторую базовую инициализацию, например, создаю свои объекты БД, кеширую объекты и т. Д.

У меня также есть глобальная функция, которая возвращает объект App .... таким образом (определение объекта приложения не показано):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

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

Итак, я могу использовать что-то вроде следующего в любом месте кода для ссылки на объекты в глобальном объекте:

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

Это не идеально, но я считаю, что это облегчает ситуацию во многих обстоятельствах.

вы можете использовать

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

или в качестве альтернативы, используя какой-то метод одноэлементного доступа

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

Почему бы не создать класс, который содержит global $ db; в своем конструкторе, а затем расширить все остальные классы из этого?

Вы можете использовать класс Registry для хранения и извлечения вашего экземпляра Database .

class Registry
{
    protected static 

Вы можете использовать класс Registry для хранения и извлечения вашего экземпляра Database .

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

Вы можете использовать класс Registry для хранения и извлечения вашего экземпляра Database .

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

Вы можете использовать класс Registry для хранения и извлечения вашего экземпляра Database .

<*>data)) { return self::

Вы можете использовать класс Registry для хранения и извлечения вашего экземпляра Database .

<*>data[$key]; } return $default; } } Registry::set('db', new Database()); $db = Registry::get('db');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top