как использовать PDO в тонкой структуре?

Я начинаю новый тонкий проект с поддержкой twig, я хочу использовать PDO в качестве уровня базы данных, как можно интегрировать? или просто использовать GLOBAL $db?

Спасибо.


person BigDiggers    schedule 07.11.2012    source источник
comment
Часто я так и делаю. Хотя это и неправильный способ ведения дел, с точки зрения ООП это просто. Конечно, вам нужно быть очень осторожным при смешивании вашего кода с другими библиотеками, которые могут использовать те же самые имена переменных. См. ответ glasz, чтобы узнать, как это сделать.   -  person Brad    schedule 07.11.2012


Ответы (2)


я против изменяемых глобалов. вы можете использовать простой фабричный метод, возвращающий ваше соединение:

function db() {
  static $db = null;
  if (null === $db)
    $db = new PDO(...);
  return $db;
}

если вы собираетесь иметь дело с другими такими проблемами, подумайте о реестре (см. этот).

Что касается изменяемых глобальных переменных:

Я против таких вещей, потому что, ну, их легко видоизменить.
Что произойдет, если во время выполнения программы обстоятельства неожиданно изменятся?
Все сломается.

Если вы единственный, кто работает над проектом, глобальные переменные могут подойти.
Но по моему опыту, даже в этом сценарии отслеживание глобальных переменных становится проблемой и нарушает логическую организацию вашего кода.
Что? если вы дойдете до того, что поделитесь своим кодом с другими, кто перезапишет такой глобальный?

Кроме того, глобальные переменные противоречат методологии инкапсуляции данных в контексте разделение интересов.

Все это играет роль в большой, широкой науке об архитектуре программного обеспечения.

Кроме того, использование фабрики в этом конкретном случае гарантирует, что вы сохраните только одну единственную ссылку на соединение с вашей базой данных.

person glasz    schedule 07.11.2012
comment
хорошая ссылка. Можете ли вы объяснить, почему вы против изменяемых глобальных переменных? :) - person Wolfpack'08; 07.11.2012
comment
@Wolfpack'08 добавил больше о моей позиции по глобальным переменным выше. - person glasz; 07.11.2012
comment
$sth = $this-›db-›prepare($sql); $sth-›выполнить(); $silos = $sth-›fetchAll(); $sth = ноль; Будет ли мой объект PDO закрыт $sth =null;? - person Abel Jojo; 13.06.2017
comment
@AbelJojo в основном, да. подробности объясняются в документации. - person glasz; 13.06.2017

Посмотрите этот проект: Slim-PDO (github)

Документация здесь

Установить через композитор: $ composer require slim/pdo

Простое использование:

$app->container->singleton('database', function () use ($app) {
  return new \Slim\PDO\Database($app->config('db.dsn'), $app->config('db.usr'), $app->config('db.pwd'));
});

// SELECT * FROM users WHERE id = ?
$selectStatement = $app->database->select()
                       ->from('users')
                       ->where('id', '=', 1234);

$stmt = $selectStatement->execute();
$data = $stmt->fetch();

// INSERT INTO users ( id , usr , pwd ) VALUES ( ? , ? , ? )
$insertStatement = $app->database->insert(array('id', 'usr', 'pwd'))
                       ->into('users')
                       ->values(array(1234, 'your_username', 'your_password'));

$insertId = $insertStatement->execute(false);
person Tarampampam    schedule 29.05.2016