PHP область видимости

Есть система роутов. Каждой странице отвечает определенная функция и в этих функциях нужно иметь доступ к глобальной переменной: допустим, драйвер работы с бд - PDO. Писать global $var, передавать как параметр или определять переменную в теле функции не хочется. Можно было бы написать обертку и вызывать методы класса как статические, но меня вполне устраивает стандартный интерфейс класса PDO, не хотелось бы плодить код.
  • Вопрос задан
  • 3243 просмотра
Решения вопроса 4
kirillplatonov
@kirillplatonov
Ruby on Rails developer
Подойдет шаблон Singleton + Registry.
Почитать здесь.
Ответ написан
omun
@omun
Если все функции в классах и у них есть общий предок, то можно в него геттером запихать драйвер и в потомках использовать.
Ответ написан
egor_nullptr
@egor_nullptr
function give_me_pdo()
{
    static $pdo;
    if (!$pdo) {
        $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    };
    return $pdo;
}
....
function handler_for_some_page()
{
    $db = give_me_pdo();
}
Ответ написан
Комментировать
oxyberg
@oxyberg
Продуктовый дизайнер ВКонтакте
Кложуры с указанием контекста.

$pdo = new PDO;
Route::get ('/', function () use ($pdo) {
    $pdo->set();
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@VovanZ
Я думаю, стоит написать обертку-синглтон.
Ответ написан
Вам надо почитать про шаблоны проектирования, например это.
Есть несколько вариантов избавления от глобальных переменных, один из них Service Locator, который по сути является тем, что было в первом ответе, то есть подвидом шаблона Registry. Делать самописный Dependency Injection Container наверное неразумно.

Ключевое отличие от использования глобальных переменных в том, что это гибче в плане управления и как следствии тестировании, когда может понадобиться эмуляция какого-то глобального сервиса
Ответ написан
Комментировать
madmages
@madmages
Человек прямоходящий
объяви эту переменную прям в роуте, а вообще это можно сделать хоть как хош
Ответ написан
Комментировать
Для начала тебе будет достаточно https://toster.ru/q/55530#answer_202248.

А вообще, погугли на тему инверсии зависимостей (IoC). Оно полезно.
Ответ написан
@daMage Автор вопроса
Почитал я комменты, спасибо всем кстати, почитал про синглтон - да, я новичек) Наверное не совсем правильно выразился. Я задал вопрос не из соображения, что плохо клонировать инстансы в разных роутах, хотя это несомненно так. Я писал, что не хочу использовать
function($handler)
function() {
  global $handler;
}
function() {
  $handler = get_instance();
}

только потому, что это занимает лишнее место в роуте. Хочется писать просто:
function() {
  $query = PDO::prepare();
}

без всяких предварительных записей.
Раньше я использовал обертку для PDO, но там выполнялись довольно тривиальные вещи. Когда же появилась необходимость писать более сложные запросы я его отбросил.
Желательно всё так и оставить:
DB::init('data');
function page1() {
  $query = DB::query();
}
DB::close();

Не знаю, может это не правильный вариант, повторюсь - я новичек.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы