Могу ли я сделать переменную глобально видимой без необходимости объявлять ее глобальной в каждом конструкторе класса PHP?
Вопрос
У меня есть класс базы данных, экземпляр которого объявлен в основном 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');